不能將屬性以ref或out的方式傳遞

看上去屬性和字段差不多,可是屬性本質上是個方法,并不是真正指向一個内存位置,所以不能像字段那樣能以ref或out方式傳遞。

Lookup運行一個鍵對應多個值,但無法直接創建,衹能通過ToLookup方法

 

原生的值類型調用ToString方法是不會裝箱的

比較"Age = " + 3.ToString()和"Age = " + 3,前者要比後者高效,因爲後者默認會裝箱。所以值類型涉及字符串操作時,應該總是使用ToString方法

 

用R格式化字符串,可以保留精度

const double number = 1.618033988749895;

            string text = string.Format("{0}", number);
double result = double.Parse(text); bool same = result == number; text = string.Format("{0:R}", number);
result = double.Parse(text);
same = result == number;

前一個same爲false,后一個爲true

 

類型的協變和逆變

衹有接口和委托才能聲明這兩個特性,汎型類是不支持的(出於類型安全的考慮)。

協變用out來修飾,針對的是返回值,潛臺詞是:如果能返回父類,自然也能返回子類。

// Covariance.

IEnumerable<string> strings = new List<string>();

IEnumerable<object> objects = strings;

逆變用in來修飾,針對的是參數,潛臺詞是:如果能傳入父類,自然也能傳入子類。

// Contravariant.

IComparer<object> objects = objectComparer;

IComparer<string> strings = objects;

 

衹讀字段無法直接賦值修改,但可以通過反射進行修改

 

匿名類型的屬性是衹讀的;元祖類型的屬性也是衹讀的

這樣是爲了防止匿名對象的HashCode發生改變

 

dynamic類型可以隱式轉換爲其它類型,object則不行

如:dynamic d = 1; int i = d;

編譯器認爲dynamic上的任何操作都是合法的

 

字段内聯初始化衹是一種簡化寫法,實際上初始化還是在構造函數中進行的

這也是爲什麽值類型不允許字段内聯初始化的原因,因爲值類型不允許無參構造函數

 

Lazy<T>實現延遲加載,調用其Value屬性時才會真正加載

 

不要定義值類型的靜態構造器,因爲CLR未必會調用

struct MyStruct
{
static MyStruct()
{
//不會被調用
Console.WriteLine("MyStruct");
} public int X;
} MyStruct[] array = new MyStruct[2];
array[0].X = 2;

 

閉包

捕獲變量是從變量聲明就開始了,而捕獲的值是看調用委托時該變量是什麽值           
    var list = new List<Action>();

            for (int i = 0; i < 5; i++)

            {

                int cnt = i * 10;

                list.Add(delegate

                {

                    Console.WriteLine(cnt);

                    cnt++;

                });

            }

            list[0]();

            list[0]();

            list[1]();

有5次循環,cnt被聲明了5次,實際上就是有5個不同的捕獲變量,所以各個委托有各自獨立的捕獲值,輸出結果是0,1,10

但如果把變量聲明放在循環外,隻聲明一次:

    int cnt;

            for (int i = 0; i < 5; i++)

            {

                cnt = i * 10;

那麽這些委托就共享同一個捕獲變量,而當委托方法調用時,由於cnt已經被循環了5次,成爲40,所以輸出結果是40,41,42

最新文章

  1. Manjaro mirror in china
  2. ql Server 高频,高并发访问中的键查找死锁解析
  3. Oracle的控制文件
  4. 内存中 OLTP - 常见的工作负荷模式和迁移注意事项(三)
  5. 【bzoj1061】 Noi2008—志愿者招募
  6. [名词解释]Constant Amortized Time
  7. [分享]关于windows下的小技巧
  8. [SharePoint 2013 入门教程 2 ] 创建WEB应用程序,网站集,网站
  9. docker入门(一)
  10. Android开发之Sqlite的使用
  11. python timeit模块用法
  12. 深入浅出的webpack构建工具--webpack4+vue+router项目架构(十四)
  13. manifold 微分流形上可以定义可微函数、切向量、切向量场、各种张量场等对象并建立其上的分析学,并可以赋予更复杂的几何结构以研究它们的性质。
  14. AWS &amp; ASP.NET
  15. Redis之字符串类型命令
  16. 关于oracle数据库压力测试
  17. vue-webpack 做出来的项目部署到服务器上,点开是空白页(我这里把项目发布到git上)
  18. Python基础.md
  19. Windows7 SP1 64bit配置IIS7.5和ASP.NET4
  20. [java实现]常见算法之字符串操作

热门文章

  1. MongoDB:最简单的增删改查(Oops,可能太简单了)
  2. Unity uGui RawImage 渲染小地图
  3. 关于System.Convert那些事
  4. C++学习之extern &quot;C&quot;
  5. linux查找nginx所在目录
  6. 关于OpenFileDialog的使用(转)
  7. 把TXT GB2312文件转换成TXT UTF8文件
  8. putty+Xmanager登陆Linux,实现图形界面操作.
  9. es6 import 与 export
  10. js mvc框架