亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Top15不起眼卻有大作用的.NET功能集

2019-11-14 13:46:33
字體:
來源:轉載
供稿:網友

目錄

1. ObsoleteAttribute
2. 設置默認值屬性: DefaultValueAttribute
3. DebuggerBrowsableAttribute
4. ??運算符
5. Curry 及 Partial 方法
6. WeakReference
7. Lazy
8. BigInteger
9. 非官方關鍵字:__arglist __reftype __makeref __refvalue
10. Environment.NewLine
11. ExceptionDispatchInfo
12. Environment.FailFast
13. Debug.Assert, Debug.WriteIf 及 Debug.Indent
14. Parallel.For 及 Parallel.Foreach
15. IsInfinity方法

 

本文介紹了.Net 常被忽略,但卻非常有用戶的15個功能,包含ObsoleteAttribute,DefaultValueAttribute,DebuggerBrowsableAttribute,?運算符,Curry 及 Partial 方法…

 

1. ObsoleteAttribute

ObsoleteAttribute: 可適用于除程序集、模塊、參數或返回值以外的所有程序元素。將元素標記為 Obsolete 可實現通知用戶的功能,表明該元素在產品之后的新版本中會被移除。

Message屬性包含一個字符串,可獲取變通方法消息,是對可選程序元素的說明。

IsError屬性:是Bool 類型,如果將值設為“True”,則編譯器會將使用已過時的程序元素視為錯誤。

   1:  public static class ObsoleteExample
   2:  {
   3:      // Mark OrderDetailTotal As Obsolete.
   4:      [ObsoleteAttribute("This PRoperty (DepricatedOrderDetailTotal) is obsolete. Use InvoiceTotal instead.", false)]
   5:      public static decimal OrderDetailTotal
   6:      {
   7:          get
   8:          {
   9:              return 12m;
  10:          }
  11:      }
  12:   
  13:      public static decimal InvoiceTotal
  14:      {
  15:          get
  16:          {
  17:              return 25m;
  18:          }
  19:      }
  20:   
  21:      // Mark CalculateOrderDetailTotal As Obsolete.
  22:      [ObsoleteAttribute("This method is obsolete. Call CalculateInvoiceTotal instead.", true)]
  23:      public static decimal CalculateOrderDetailTotal()
  24:      {
  25:          return 0m;
  26:      }
  27:   
  28:      public static decimal CalculateInvoiceTotal()
  29:      {
  30:          return 1m;
  31:      }
  32:  }
 如果運行程序,編譯器就會報錯以及Warning。
   1:  Console.WriteLine(ObsoleteExample.OrderDetailTotal);
   2:  Console.WriteLine();
   3:  Console.WriteLine(ObsoleteExample.CalculateOrderDetailTotal());

2.  通過“DefaultValueAttribute”屬性可設置缺省值

DefaultValueAttribute 指定屬性的默認值。可以使用任何值創建 DefaultValueAttribute。成員的默認值通常是其初始值??梢暬O計器可以使用默認值重置成員的值。代碼生成器也可使用默認值確定是否 為成員生成代碼,但是必須在成員函數中設置初始值。

   1:  public class DefaultValueAttributeTest
   2:  {
   3:      public DefaultValueAttributeTest()
   4:      {
   5:          // Use the DefaultValue propety of each property to actually set it, via reflection.
   6:          foreach (PropertyDescriptor prop in TypeDescriptor.GetProperties(this))
   7:          {
   8:              DefaultValueAttribute attr = (DefaultValueAttribute)prop.Attributes[typeof(DefaultValueAttribute)];
   9:              if (attr != null)
  10:              {
  11:                  prop.SetValue(this, attr.Value);
  12:              }
  13:          }
  14:      }
  15:   
  16:      [DefaultValue(25)]
  17:      public int Age { get; set; }
  18:   
  19:      [DefaultValue("Anton")]
  20:      public string FirstName { get; set; }
  21:   
  22:      [DefaultValue("Angelov")]
  23:      public string LastName { get; set; }
  24:   
  25:      public override string ToString()
  26:      {
  27:          return string.Format("{0} {1} is {2}.", this.FirstName, this.LastName, this.Age);
  28:      }
  29:  }

 

3. DebuggerBrowsableAttribute

表示成員是否在Debugger 變量窗口顯示以及如何顯示。

   1:  public static class DebuggerBrowsableTest
   2:  {
   3:      private static string squirrelFirstNameName;
   4:      private static string squirrelLastNameName;
   5:   
   6:      // The following DebuggerBrowsableAttribute prevents the property following it 
   7:      // from appearing in the debug window for the class.
   8:      [DebuggerBrowsable(DebuggerBrowsableState.Never)]
   9:      public static string SquirrelFirstNameName 
  10:      {
  11:          get
  12:          {
  13:              return squirrelFirstNameName;
  14:          }
  15:          set
  16:          {
  17:              squirrelFirstNameName = value;
  18:          }
  19:      }
  20:   
  21:      [DebuggerBrowsable(DebuggerBrowsableState.Collapsed)]
  22:      public static string SquirrelLastNameName
  23:      {
  24:          get
  25:          {
  26:              return squirrelLastNameName;
  27:          }
  28:          set
  29:          {
  30:              squirrelLastNameName = value;
  31:          }
  32:      }
  33:  }

逐步調試程序時,就會發現代碼會一直在執行:

   1:  DebuggerBrowsableTest.SquirrelFirstNameName = "Hammy";
   2:  DebuggerBrowsableTest.SquirrelLastNameName = "Ammy";

4. ??操作符

?? 運算符稱作 null 合并運算符。如果此運算符的左操作數不為 null,則此運算符將返回左操作數;否則返回右操作數,如果在嘗試將可以為null 值的類型分配給不可以為null值的類型時,沒有使用??運算符,則會生成編譯時的錯誤。如果使用強制轉換,且當前未定義可以為 null 值的類型,則會引發 InvalidOperationException 異常。

   1:  int? x = null;
   2:  int y = x ?? -1;
   3:  Console.WriteLine("y now equals -1 because x was null => {0}", y);
   4:  int i = DefaultValueOperatorTest.GetNullableInt() ?? default(int);
   5:  Console.WriteLine("i equals now 0 because GetNullableInt() returned null => {0}", i);
   6:  string s = DefaultValueOperatorTest.GetStringValue();
   7:  Console.WriteLine("Returns 'Unspecified' because s is null => {0}", s ?? "Unspecified");

5. Curry 及 Partial 方法

Curry 方法是把接受多個參數的函數變換成接受一個單一參數(最初函數的第一個參數)的函數,并且返回接受余下的參數且返回結果的新函數的技術。

   1:  public static class CurryMethodExtensions
   2:  {
   3:      public static Func<A, Func<B, Func<C, R>>> Curry<A, B, C, R>(this Func<A, B, C, R> f)
   4:      {
   5:          return a => b => c => f(a, b, c);
   6:      }
   7:  }

如果無法確定成員函數的返回類型可使用Var執行。

Partial—Partial類型允許我們將一個類、接口或結構分成好幾個部分,分別實現在幾個不同的.cs 文件中。關鍵字partial是一個上下文關鍵字,只有和class、struct、interface放在一起時才有關鍵字的含義。因此partial 的引入不會影響現有代碼中名稱為partial的變量。

 
   1:  public static class CurryMethodExtensions
   2:  {
   3:      public static Func<C, R> Partial<A, B, C, R>(this Func<A, B, C, R> f, A a, B b)
   4:      {
   5:          return c => f(a, b, c);
   6:      }
   7:  }

6. WeakReference

Weak Reference 表示類型化弱引用,即在引用對象的同時仍然允許垃圾回收來回收該對象。如果你想使用該引用,可以設置為強引用類型,保證該對象不被回收。

   1:  WeakReferenceTest hugeObject = new WeakReferenceTest();
   2:  hugeObject.SharkFirstName = "Sharky";
   3:  WeakReference w = new WeakReference(hugeObject);
   4:  hugeObject = null;
   5:  GC.Collect();
   6:  Console.WriteLine((w.Target as WeakReferenceTest).SharkFirstName);

7. Lazy<T>

Lazy<T>提供對延遲一些大資源或資源緊張的對象的初始化的支持。在程序的生存期內,特別是在這種方式創建或執行可能不發生使用延遲初始化延遲一種或大量占用資源的對象的創建、資源的任務的執行。

 

   1:  public abstract class ThreadSafeLazyBaseSingleton<T>
   2:      where T : new()
   3:  {
   4:      private static readonly Lazy<T> lazy = new Lazy<T>(() => new T());
   5:      
   6:      public static T Instance
   7:      {
   8:          get
   9:          {
  10:              return lazy.Value;
  11:          }
  12:      }
  13:  }

 

8. BigInteger

BigInteger 類型 表示任意大的帶符號整數。理論上來講,該類型的數據是沒有邊界值限制的。該類型與其他整型類型不同,包含MinValue和MaxValue 屬性。
   1:  string positiveString = "91389681247993671255432112000000";
   2:  string negativeString = "-90315837410896312071002088037140000";
   3:  BigInteger posBigInt = 0;
   4:  BigInteger negBigInt = 0;
   5:   
   6:  posBigInt = BigInteger.Parse(positiveString);
   7:  Console.WriteLine(posBigInt);
   8:  negBigInt = BigInteger.Parse(negativeString);
   9:  Console.WriteLine(negBigInt);

 

9. 未官方記錄的 C# 關鍵字: __arglist __reftype __makeref __refvalue

第9條講  的關鍵字官方文檔并沒有記錄,可能正在測試中。然而這些關鍵字豐富了Visual Studio 編輯器的功能,也能被識別。

開發人員可以使用__makeref關鍵字創建變量。使用__refvalue修飾變量可以從 TypedReference中獲得變量值。__arglist關鍵字與params的作用相同,可以訪問參數列表。

   1:  int i = 21;
   2:  TypedReference tr = __makeref(i);
   3:  Type t = __reftype(tr);
   4:  Console.WriteLine(t.ToString());
   5:  int rv = __refvalue( tr,int);
   6:  Console.WriteLine(rv);
   7:  ArglistTest.DisplayNumbersOnConsole(__arglist(1, 2, 3, 5, 6));

 

為了使用__arglist, 需要定義ArglistTest 類

   1:  public static class ArglistTest
   2:  {
   3:      public static void DisplayNumbersOnConsole(__arglist)
   4:      {
   5:          ArgIterator ai = new ArgIterator(__arglist);
   6:          while (ai.GetRemainingCount() > 0)
   7:          {
   8:              TypedReference tr = ai.GetNextArg();
   9:              Console.WriteLine(TypedReference.ToObject(tr));
  10:          }
  11:      }
  12:  }
 
 

10. Environment.NewLine

獲取為此環境定義的換行字符串。

   1:  Console.WriteLine("NewLine: {0}  first line{0}  second line{0}  third line", Environment.NewLine);

11. ExceptionDispatchInfo

表示捕獲特定點的異常情況??梢允褂肊xceptionDispatchInfo.Throw 方法,命名空間為System.Runtime.ExceptionServices。

   1:  ExceptionDispatchInfo possibleException = null;
   2:   
   3:  try
   4:  {
   5:      int.Parse("a");
   6:  }
   7:  catch (FormatException ex)
   8:  {
   9:      possibleException = ExceptionDispatchInfo.Capture(ex);
  10:  }
  11:   
  12:  if (possibleException != null)
  13:  {
  14:      possibleException.Throw();
  15:  }

 

12. Environment.FailFast()

 

如果想退出程序,且不需要調用任何Finally 塊或Finalizers,可以使用FailFast。

   1:  string s = Console.ReadLine();
   2:  try
   3:  {
   4:      int i = int.Parse(s);
   5:      if (i == 42) Environment.FailFast("Special number entered");
   6:  }
   7:  finally
   8:  {
   9:      Console.WriteLine("Program complete.");
  10:  }

 

13. Debug.Assert & Debug.WriteIf & Debug.Indent

Debug.Assert——檢查條件;如果條件為 false,則顯示一個消息框,其中會顯示調用堆棧。Debug.Assert盡在調試版中有效,在發布版中如果要執行斷言,則使用Trace.Assert。

Debug.Assert(1 == 0, "The numbers are not equal! Oh my god!");
 

如果Assert在Debug模式下失敗,則會顯示下圖:

 

14. Parallel.For & Parallel.Foreach

多線程的情況下較為常用。

Parallel.For—執行循環,迭代可以運行。

   1:  int[] nums = Enumerable.Range(0, 1000000).ToArray();
   2:  long total = 0;
   3:   
   4:  // Use type parameter to make subtotal a long, not an int
   5:  Parallel.For<long>(0, nums.Length, () => 0, (j, loop, subtotal) =>
   6:  {
   7:      subtotal += nums[j];
   8:      return subtotal;
   9:  },
  10:      (x) => Interlocked.Add(ref total, x)
  11:  );
  12:   
  13:  Console.WriteLine("The total is {0:N0}", total);

Interlocked.Add 方法將兩個整型值相加,并將結果保存到第一個數值,可以作為原子操作。

Parallel.Foreach——執行 foreach(在 Visual Basic 中為 For Each)操作,其中在 Partitioner 上可能會并行運行迭代。

 

 

15. IsInfinity

表示數值是無窮大情況。僅double和float類型數值除以0是產生。

   1:  Console.WriteLine("IsInfinity(3.0 / 0) == {0}.", Double.IsInfinity(3.0 / 0) ? "true" : "false");


原文鏈接:http://www.codeproject.com/Articles/1021335/Top-Underutilized-Features-of-NET

上一篇:C#

下一篇:微信公眾平臺開發(三)

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产中文字幕久久网| 亚洲欧美一区二区三区情侣bbw| 欧美激情在线有限公司| www.日韩视频| 欧美激情视频在线| 欧美日韩国产91| 精品无人区太爽高潮在线播放| 午夜精品蜜臀一区二区三区免费| 国产精品视频永久免费播放| 亚洲电影免费在线观看| 日韩欧美aⅴ综合网站发布| 亚洲福利视频在线| 欧美成年人视频| 亚洲男人av在线| 国产精品一二三在线| 51久久精品夜色国产麻豆| 欧美黄网免费在线观看| 亚洲精品之草原avav久久| 欧美又大又粗又长| 欧美理论片在线观看| 精品久久久久久亚洲国产300| 成人黄色免费在线观看| 日韩**中文字幕毛片| 国产欧美在线看| 一区二区三区亚洲| 精品一区二区亚洲| 92看片淫黄大片欧美看国产片| 日韩欧美在线播放| 亚洲欧洲第一视频| 精品久久久久久久久久久久| 92福利视频午夜1000合集在线观看| 日韩欧美国产视频| 精品久久久久久国产91| 久久精品一偷一偷国产| 亚洲欧美国产精品va在线观看| 久久久久久成人精品| 久久久国产影院| 4438全国亚洲精品在线观看视频| 亚洲国产精品成人va在线观看| 亚洲欧美一区二区三区在线| 最近2019年日本中文免费字幕| 91在线看www| 九九热精品视频国产| 国产午夜精品全部视频播放| 亚洲国产中文字幕久久网| 日韩国产在线看| 欧美怡红院视频一区二区三区| 国产va免费精品高清在线| 欧美一区深夜视频| 97久久精品人人澡人人爽缅北| 97国产suv精品一区二区62| 亚洲精品国产电影| 97在线看免费观看视频在线观看| 国产成人精品免费视频| 欧美老女人性生活| 亚洲护士老师的毛茸茸最新章节| 精品久久久久久久久久久| 国产免费一区二区三区在线观看| 亚洲精品一区久久久久久| 51视频国产精品一区二区| 91精品在线影院| 欧美精品中文字幕一区| 亚洲人精品午夜在线观看| 91免费福利视频| 在线精品91av| 日韩精品在线观看一区二区| 97久久精品人人澡人人爽缅北| 亚洲午夜国产成人av电影男同| 日韩欧美在线国产| 欧美色道久久88综合亚洲精品| 日韩在线观看成人| 日本精品久久电影| 97精品在线视频| 欧美尺度大的性做爰视频| 欧美日韩加勒比精品一区| 国产精品久久久久久久久久尿| 97国产精品视频| 欧美日韩福利电影| 精品欧美aⅴ在线网站| 亚洲欧美日韩在线一区| 青青精品视频播放| 国产精品极品美女粉嫩高清在线| 色综合久综合久久综合久鬼88| 日韩一区二区精品视频| 久久精品国产69国产精品亚洲| 国产精品视频1区| 国产精品美女久久久久久免费| 色综合伊人色综合网| 午夜精品福利视频| 视频一区视频二区国产精品| 日本一欧美一欧美一亚洲视频| 欧美日在线观看| 久久久中精品2020中文| 日韩精品在线视频| 91精品国产91久久久久久最新| 欧美超级乱淫片喷水| 国产在线观看精品| 欧美电影院免费观看| 成人性生交大片免费看小说| 久久久久久久999精品视频| 成人黄色网免费| 欧美另类69精品久久久久9999| 成人福利网站在线观看11| 97人洗澡人人免费公开视频碰碰碰| 亚洲第一福利视频| 精品久久久久久亚洲国产300| 亲爱的老师9免费观看全集电视剧| 国产性猛交xxxx免费看久久| 国产在线观看不卡| 欧美综合国产精品久久丁香| 国产精品扒开腿做爽爽爽男男| 亚洲精品美女在线观看播放| 欧美一级视频一区二区| 91国产中文字幕| 国产精品嫩草影院久久久| 亚洲精品午夜精品| 日韩网站免费观看高清| 精品久久在线播放| 欧美老女人xx| 一级做a爰片久久毛片美女图片| 深夜福利亚洲导航| 国产自产女人91一区在线观看| 中文字幕日韩av综合精品| 亚洲国产欧美精品| 亚洲电影天堂av| 最近2019好看的中文字幕免费| 成人激情在线观看| 欧美巨大黑人极品精男| 国产日韩精品在线播放| 亚洲精品日韩欧美| 中文字幕亚洲天堂| 俺也去精品视频在线观看| 亚洲成人免费在线视频| 亚洲精品日韩在线| 国产噜噜噜噜噜久久久久久久久| 伊人久久久久久久久久久久久| 亚洲精品二三区| 亚洲天堂第二页| 国产精品女人久久久久久| 欧美激情伊人电影| 国产精品一区二区三| 色婷婷av一区二区三区在线观看| 在线观看国产精品淫| 日韩av中文在线| 久久久久久久久久久免费| 91视频国产一区| 欧美日本高清视频| 国产免费一区二区三区在线观看| 亚洲美女喷白浆| 国产精品欧美风情| 欧美成年人视频| 亚洲精品小视频在线观看| 亚洲免费影视第一页| 91精品久久久久| 欧美最猛性xxxx| 日韩资源在线观看| 精品国产一区二区三区久久狼黑人| 国产欧美日韩综合精品| 亚洲国产精品99久久| 久久人体大胆视频| 91高清免费视频| 亚洲女人被黑人巨大进入al| 国产91九色视频| 欧美影院成年免费版|