关闭

编程小问题和Tips(C#)

392人阅读 评论(0) 收藏 举报

C# 方面

1、关于C#参数传递的问题,除了int,long,string等是按值传递外,其他的一些类,结构体都默认是引用传递,相当于关键字ref,ref,out等关键字也主要用于按值传递的参数修饰

2、C#中的[Serializable] 序列化 Serializable这个标签是类可以被序列化的特性,表示这个类可以被序列化。什么叫序列化?我们都知道对象是暂时保存在内存中的,不能用U盘考走了,有时为了使用介质转移对象,并且把对象的状态保持下来,就需要把对象保存下来,这个过程就叫做序列化,通俗点,就是把人的魂(对象)收伏成一个石子(可传输的介质)什么叫反序列化?就是再把介质中的东西还原成对象,把石子还原成人的过程。在进行这些操作的时候都需要这个可以被序列化,要能被序列化,就得给类头加[Serializable]特性。通常网络程序为了传输安全才这么做。

3、string stringbuffer stringbuilder

        对于String类型,每次的操作都相当于new一个然后再进行append 等一系列操作,会对内存的影响非常大,但是速度较快

        对于StringBuffer类型,Java.lang.StringBuffer线程安全的可变字符序列速度较慢。类似于 String 的字符串缓冲区,但不能修改

        对于StringBuilder 类,因为它支持所有相同的操作,但由于它不执行同步,所以速度更快,但是如果将 StringBuilder 的实例用于多个线程是不安全的。需要这样的同步,则建议使用 StringBuffer

        大部分情况下 StringBuilder>StringBuffer>String

4、字符串前加@ ""表示忽略字符串的转义字符\

5、创建DataRow得先创建DataTable后再创建

6、Ajax不是程序,无刷新状态将数据提交给后台,后台处理结果在浏览器做相应的处理,传数据前台html代码从一般处理程序的后台写前台.aspx文件完全可以实现

      .ashx的功能 .ashx性能高,免去了控件解析以及页面处理过程,适合于生成动态图片,生成动态文本之类,实现某一具体功能的操作,比较复杂的功能,处理回发控件的事件则不合适

7、.net 编译器编译成 IL语言代码(intermediate language) 交给.net vm 再转换成本地代码,与CPU寄存器打交道

8、ref C#输入相当于 C指针

9、各个项目连接通过解决方案 引用 C# 注意namespace的应用

10、asp:fileupload控件中,若上传文件大小为0,则hasfile为智能判断为false

11、<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

过时了,现在html5推荐的是
<!DOCTYPE html>
<html>

会造成一些图标位置问题

12、Thread was being aborted 在捕获异常的try块中使用response.redirect或者response.write();response.end();有时会提示线程已被终止("Threading was being aborted")错误;

分析该错误的原因是因为执行这两条命令会重新发送一次请求,将当前的请求abort掉;通俗讲就是当进程还想继续进行的时候,发现自己已经被调用过abort方法了,既然自己作为线

程已被终止,就无法继续执行了,于是抛出异常

解决方法有以下三种:

1、将这两个命令放到try/catch块外,不捕获异常就不会提示这个错误;

2、捕获异常时进行判断:

try
{}
catch(Exception e)
{
if(!(ex is System.Threading.ThreadAbortException))
{
//在这里显示错误
}
}

3、捕获进程终止错误不做处理

try
{}
catch (ThreadAbortException)
{ }
catch(Exception ex)
{
//显示错误
}
有网友说可以在Response.Write();加上Response.Clear();不知道这个方法是否可行;
13、Response.Clear();
       //优先取得代理IP
       string IP= Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
       if (string.IsNullOrEmpty(IP))
       {
         
//没有代理IP则直接取客户端IP
          IP= Request.ServerVariables["REMOTE_ADDR"];
       }

       Response.Write(IP);
Response.End();
但可以用request.Headers.Add("X_FORWARDED_FOR","0.0.0.0");伪造
严格说,HTTP HEADER 只能是ASCII编码,因为Client没有办法取得HEADER的编码信息(内容编码在Header定义)。浏览器总是用当前机器的缺生编码方式解码HTTP HEADER,所以对你的例子,如果Server用GB2312 Encoding,Client用GB2312 Decoding,就没有问题。如果Client的缺生Encoding不是GB2312,就有问题了(比如我的机器,缺省Encoding是英文,UTF-8,通过你的连接就不能得到正确的中文文件名)。

.NET WebRequest总是用UTF-8解码HTTP Header(至少我没发现如何改变这种行为),所以如果Server用的是GB2312,那么结果总是不会对。唯一的办法是对string重新编码(纯粹Hack行为):

                if (key == "Content-Disposition")
                {
                    string str = res.Headers[key];
                    byte[] bt = new byte[str.Length];
                    for (int i = 0; i < str.Length; ++ i )
                    {
                        bt[i] = (byte)str[i];
                    }
                    Console.WriteLine("{0} = {1}",
                        key,
                        Encoding.GetEncoding("GB2312").GetString(bt));
                }
14、一个局部变量通常通过指定的类型名称和说明符来定义,它指定了变量名称和一个任意的初始值<A local variable is defined by specifying a type name and a declarator that specifies the variable name and an optional initial value>(ECMA-334 C# 8.3 Variables and parameters)

1、变量是类或者结构中的字段,如果没有进行显示赋值,在默认状态下创建相应变量时,其值为对应类型默认值。

2、方法的局部变量必须在代码中显示初始化,之后才可以在语句中进行使用。

15、SqlConnection的Close和Dispose是一样的效果,区别是Dispose之后不能再Open。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:152965次
    • 积分:1700
    • 等级:
    • 排名:千里之外
    • 原创:12篇
    • 转载:64篇
    • 译文:0篇
    • 评论:8条
    文章分类
    最新评论