最近一个星期看了一个网站关于.net学习网(http://www.lmwlove.com/)中C#版面的所有文章。把自己不是很明白的地方都标注了,之前没有注意到的地方也标注了。
今天就把这些整理后的弄上来。留作日后参考。
1. const 字段只能在该字段的声明中初始化。
readonly 字段可以在声明或构造函数中初始化。因此,
根据所使用的构造函数,readonly 字段可能具有不同的
值。
2. const 字段是编译时常数,而 readonly 字段可用于
运行时常数。
3. const 默认就是静态的,而 readonly 如果设置成静
态的就必须显示声明。
4.const 对于引用类型的常数,可能的值只能是
string 和 null。readonly可以是任何类
数组有很多的优点,比如说数组在内存中是连续存储的,
所以它的索引速度是非常的快,而且赋值与修改元素也很
简单
5. ArrayList不是类型安全的。既使我们保证在插入数据的
时候都很小心,都有插入了同一类型的数据,但在使用的
时候,我们也需要将它们转化为对应的原类型来处理。这
就存在了装箱与拆箱的操作,会带来很大的性能损耗。
而List类是ArrayList类的泛型等效类。它的大部分用法
都与ArrayList相似,因为List类也继承了IList接口。
最关键的区别在于,在声明List集合时,我们同时需要
为其声明List集合内数据的对象类型。
6.堆和栈的区别?
答:栈是编译期间就分配好的内存空间,因此你的代码中
必须就栈的大小有明确的定义;堆是程序运行期间动态分
配的内存空间,你可以根据程序的运行情况确定要分配的
堆内存的大小
7. 值类型和引用类型的区别?
答:值类型的值是存放在堆栈中的,改变其值,不改变变
量原有的值,而引用类型的值是存放在栈中的,其引用的
地址是存放在堆栈中的,改变其值也就改变了变量原有的
值。值类型不允许包含null值,然而可空类型可以将
null赋值给值类型l。
8. ASP.net的身份验证方式有哪些?
答:windows,forms,passport
9.Heap与stack的差别?
答:Heap是堆,空间是由手动操作分配和释放的,它的
存储区很大的自由存储区。
Stack是栈,是由是操作系统自动分配和释放的,栈上的
空间是有限的。程序在编译期间变量和函数分配内存都是
在栈上进行的,且在运行时函数调用时的参数的传递也是
在栈上进行的。
10. 今天看到有朋友在群里讨论i++与++i的区别,这里小编
发表一些自己对于两者区别的解释。
i--与--i的区别和i++与++i的区别是一样的,我们理解
了i++与++i的区别,同样也就理解了i--与--i的区别.
计算上的区别:
i++ 先计算,再将i自身的值+1。
++i 先将i自身的值加+1,再参与计算。
我们来看一个示例:
static void Main(string[] args)
{
int i = 2;
int j = i + (i++);
Console.WriteLine(j);
Console.WriteLine(i);
}
这个打印出来会是什么结果呢?读者可以先根据自己的理
解算出打印值来,我们再来分析。
根据我们上面的讲解,i++,是先计算,然后再将自身的
值+1,那么上面的示例实际上就是:
static void Main(string[] args)
{
int i = 2;
int j = i+i;
int i=i+1;
Console.WriteLine(j);
Console.WriteLine(i);
}
打印出来的结果应该就是
4
3
测试,结果正确!
我们再来看看++i的示例:
static void Main(string[] args)
{
int i = 2;
int j = i + (++i);
Console.WriteLine(j);
Console.WriteLine(i);
}
前面有讲过,++i,是先将i自身的值加+1,再参与计算,
那么上面的示例实际上就是:
static void Main(string[] args)
{
int i = 2;
int i=i+1;
int j = i+i;
Console.WriteLine(j);
Console.WriteLine(i);
}
那打印出来的结果应该就是:
5
3
测试,结果正确!
我们理解了i++与++i的实际运算过程,那么i++与++i究
竟有没有本质上的区别的呢?
本质上的区别:
++i不会产生临时对象
i++在返回时会有一个临时对象的创建
所以,在++i和i++ 效果相同的时候,最好使用++i
11.性能上的区别:
静态方法效率要稍微高一些,但是它会常驻内存,占用内
存空间,而动态方法在调用完后会自动释放,节省内存空
间。
什么情况下使用动态方法,什么情况下使用静态方法:
1,使用静态方法是有好处的,因为静态方法只维护一份拷
贝,所以无论你有多少个实例,内存中都只会有一份拷贝
。
2,使用频繁的方法用静态方法,比如数据库操作类,我们
就是使用静态方法。使用的少的方法用动态的。因为静态
的速度快,但占内存,就像是缓存一样,经常用的数据我
们应该应该将它们缓存起来。动态方法的调用速度相对慢
些,但调用完后,会立即释放类,节省内存。
12.概念:
1.值类型:
数据存储在内存的堆栈中,从堆栈中可以快速地访问这些
数据,因此,值类型表示实际的数据。
2.引用类型:
表示指向存储在内存堆中的数据的指针或引用(包括类、
接口、数组和字符串)。
区别:
基本区别在于它们在内存中的存储方式。值类型将值存放
在内存中,这些值类型都存储在堆栈中。原始数据类型(
如bool和int)都属于此类型。而引用类型的内存单元中
只存放内存堆中对象的地址,而对象本身放在内存堆中。
如果引用的值类型的值是null,则表示未引用任何对象
。
总结:
存放内容:值类型为实际值,引用类型为一个引用
存放地址:值类型为内联(堆栈),引用类型为堆
默认值:值类型为0,引用类型为空
传递参数:值类型为复制值,引用类型为复制引用
13.
、System.Text.Encoding.Default.GetBytes(变量)
字码转换 转为比特码
如:byte[] bytStr =
System.Text.Encoding.Default.GetBytes(str);
然后可得到比特长度:
len = bytStr.Length;
14.
String user_IP=Request.ServerVariables
["REMOTE_ADDR"].ToString();
取远程用户IP地址
15.
穿过代理服务器取远程用户真实IP地址:
if(Request.ServerVariables["HTTP_VIA"]!
=null){
string user_IP=Request.ServerVariables
["HTTP_X_FORWARDED_FOR"].ToString();
}else{
string user_IP=Request.ServerVariables
["REMOTE_ADDR"].ToString();
}
16.
char.IsWhiteSpce(字串变量,位数)——逻辑型
查指定位置是否空字符;
如:
string str="中国 人民";
Response.Write(char.IsWhiteSpace(str,2));
//结果为:True, 第一个字符是0位,2是第三个字符。
17、char.IsPunctuation('字符') --逻辑型
查字符是否是标点符号
如:Response.Write(char.IsPunctuation('A'));
//返回:False
18、(int)'字符'
把字符转为数字,查代码点,注意是单引号。
如:
Response.Write((int)'中'); //结果为中字的
代码:20013
19、(char)代码
把数字转为字符,查代码代表的字符。
如:
Response.Write((char)22269); //返回“国”字
。
取扩展名请使用
System.IO.Path.GetExtension
(this.mes_pic.PostedFile.FileName)
不能继承System.Web.UI.Page 的Cache使用:
HttpContext.Current.Cache
装箱:为了将一个值类型转换为一个引用类型,就要使
用一种叫装箱的机制。Int32 a=5;Object o=a;
对值类型的装箱时内部发生的事情如下:
1,首先在托管堆中分配内存,大小为值类型字段所需内
存量加上额外成员(类型对象指针和同步索引块)大小。
2,值类型字段复制到新分配的堆内存。
3,返回对象的引用。
拆箱:首先,拆箱不是装箱的逆过程,它其实是获取一
个指针的过程,指针指向一个对象中的原始值类型。
拆箱之后,紧接着是字段的复制过程。
在对一个对象拆箱的时候,只能将其转化为原来未装箱的
值类型。例如:Int32 x=5; Object o=x; Int16 y=
(Int16)o;
这时候就会发生异常。可以这样来写:Int16 y=
(Int16)(Int32)o;必须首先转化为原来的类型