最近一个星期的学习,比较杂乱

最近一个星期看了一个网站关于.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;必须首先转化为原来的类型

原文地址:https://www.cnblogs.com/qishiguilai/p/basedknowledge.html