C#编程解惑(三)

1、静态类里面只能有静态成员(包括静态字段、静态方法),不能包含非静态的变量。静态类不能有构造函数。

2、静态类里面可以声明const变量而且前面不用添加static ,因为默认的const变量默认就是static的,它本身就是属于类本身的。readonly不是静态的,所以我们在数据库工具类里面写connectionstring的时候都使用static readonly变量。

3、以前我写方法的时候,如果返回的是bool但是里面方法操作的返回值是int的时候,我就会在里面写上如下代码,

string sql = "select count(1) from tb_users where id=100";
SqlCommand cmd = new SqlCommand();
int count = cmd.ExecuteNonQuery();
if (count > 0)
{
    return true;
}
return false;

最近看了一行代码,呵呵,才发现以前些麻烦了,代码如下:

string sql = "select count(1) from tb_users where id=100";
SqlCommand cmd = new SqlCommand();           
return cmd.ExecuteNonQuery() > 0;

这样就可以了,简化了不少代码。

4、我们在写代码的时候如何判断一个对象是否需要外面套用using呢?经验之谈是一方面还有一个就是我们可以看看该对象是否有dispose方法,如果有这个方法或者实现了IDisposable接口最好嵌套在using里面,否则我们还需要手动的去调用dispose方法。

5、我们在使用using来释放资源的代码段里面不要有阻断当前进程的方法,如不要在数据库的sqlreader操作中进行messagebox的子操作,因为会阻断当前进程,资源得不到释放,最好在外面写一个标志位,然后通过标志位来判断,否则用户停留在messagebox画面去干其他事情的时候资源就得不到释放了。

 

6、静态构造函数,不管被调用了几次还是在几个类中被分别被调用,静态构造函数只执行一次,以后再也不执行了。

//Class1.i = 0;//先执行静态构造函数再赋值,所以这里打开下面就是0,否则下面为1
Response.Write(Class1.i);

 7、以后添加分号或者其他符号来分割字符串的时候不要使用这种形式,代码如下,eg:

StringBuilder sb=new StringBuilder();
List<int> myList = new List<int>() { 1, 23, 4, 6, 7, 8 };
foreach (var i in myList)
{
    sb.Append(i+";");
}
Console.WriteLine(sb.ToString());
Console.ReadLine();

上面代码的执行结果如下:

1;23;4;6;7;8;

而是要使用join来完成这个工作,具体代码如下,eg:

List<int> myList = new List<int>() { 1, 23, 4, 6, 7, 8 };
string str = string.Join(";", myList);
Console.WriteLine(str);
Console.ReadLine();

执行结果如下:

1;23;4;6;7;8

通过上面结果就可以看出来,还是下面这种形式好一些,因为我们肯定会使用split,如果没有第二个参数的话,那么我们就需要去除最后一个;,然后再split,而且我觉得性能还是join应该更好一些,毕竟是微软封装的方法吗。

8、我们在拼接sql文的时候,都知道要使用参数这个就不多说了,我要说的是拼接的过程,我们应该声明两个list泛型变量,然后在使用的时候使用join(join 中使用and组合在一起),而参数就不用拼接了,但是参数里面涉及一个问题就是like 的问题,参数不能直接添加%,只能在参数值得时候添加%。

 9、string.formater的使用 

StringBuilder sb = new StringBuilder();
protected void Page_Load(object sender, EventArgs e)
{
    byte[] myByte = Encoding.UTF8.GetBytes("我们");
    foreach (var c in myByte)
    {
        Response.Write(c.ToString() + "<br/>");
    }
    Response.Write("<hr/>");
    foreach (var b in myByte)
    {
        Response.Write(sb.AppendFormat("{0:X2}", b));
       //转换成16进制截取2位。
    }
}

 上面的"{0:X2}" 中x后面的2可以换成7、8、9、10等数字都可以。

 

10、今天无意间想到了一个叫做动态密码的东西,这个东西挺好玩的,我们可以动态的更改一个用户的密码,然后把特定的密码以短信形式或者以邮件形式发送给用户,然后用户获取密码之后再用新密码登录,其实这个有点像密码找回的感觉,生成的密码都是随机的,同时生成密码的同时在后台更新密码字段并且发送邮件或者短信即可。

 

11、c# 默认修饰符

接口/委托 默认的访问修饰符是internal;

接口中成员的访问修饰符默认是public,但是不可以写public,因为默认就是这样的;

命名空间的访问修饰符默认是public的;

方法或者变量的默认修饰符是private;

 

12、我们可以把一个类拆分成多个,但是编译器编译的时候会自动的把多个particle类整合成一个。我们可以看一下我们网站编译过后的dll文件,就可以看出来。具体实例代码如下,eg:

//class1 部分类 
 public partial class Class1
    {
        void Test2()
        {
        }
    }

//class1 部分类 
 public partial class Class1
    {
        public void Test1()
        {
        }
    }

编译过后,然后在使用反编译软件,就会发现如下代码,eg:

namespace WebApplication1
{
    public class Class1
    {
        public void Test1()
        {
        }
        private void Test2()
        {
        }
    }
}

会自动的把两部分代码整合到一个类里面来,这也是asp.net 实现页面和后台代码分离的实现。而且一个类以后要是想拓展或者这个类的功能太过庞大,这个是时候就可以使用部分类来实现。

 

13、yield这个关键字回去看看。

// Method that takes an iterable input (possibly an array)
// and returns all even numbers.
public static IEnumerable<int> GetEven(IEnumerable<int> numbers)
{
    foreach(int i in numbers)
    {
        if (i % 2 == 0) yield return i;
    }
}

 14、错误日志记录问题,log4net  或者其他框架 回去自己看看。

 

posted @ 2015-05-05 21:24  我的___爱  阅读(263)  评论(0)    收藏  举报