最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#?中值類型的實現(xiàn)示例

 更新時間:2026年06月16日 09:52:24   作者:叫我少年  
值類型和引用類型是?C#?類型系統(tǒng)的兩大支柱,值類型變量"直接裝數(shù)據(jù)",引用類型變量"裝數(shù)據(jù)地址",下面就來詳細的介紹一下值類型的使用和引用類型的對比實現(xiàn)

值類型和引用類型是 C# 類型系統(tǒng)的兩大支柱。類型變量"直接裝數(shù)據(jù)",引用類型變量"裝數(shù)據(jù)地址"——這看似簡單的差別,卻深刻影響著賦值、傳參、方法返回的行為。這篇來徹底拆解。

  1. 核心行為:值類型復制的是數(shù)據(jù)實例本身
  2. 重要警告:值類型包含引用類型成員時的"淺復制"陷阱
  3. 值類型的三種種類:結(jié)構(gòu)、枚舉、聯(lián)合聲明
  4. 簡單類型的特殊性:文字、常量、編譯期求值
  5. ??struct?? 約束與 ?System.Enum?? 約束

一、核心行為:賦值即復制

值類型的變量直接包含類型實例,賦值時復制整個實例。

 public struct MutablePoint
 {
     public int X;
     public int Y;
 ?
     public MutablePoint(int x, int y) => (X, Y) = (x, y);
     public override string ToString() => $"({X}, {Y})";
 }
 ?
 var p1 = new MutablePoint(1, 2);
 var p2 = p1;       // 復制整個結(jié)構(gòu)體
 p2.Y = 200;        // 只影響 p2
 ?
 Console.WriteLine(p1);  // (1, 2)  ? p1 不受影響
 Console.WriteLine(p2);  // (1, 200)

方法傳參也是復制:

 static void MutateAndDisplay(MutablePoint p)
 {
     p.X = 100;    // 改的是副本
     Console.WriteLine(p);  // (100, 200)
 }
 ?
 MutateAndDisplay(p2);
 Console.WriteLine(p2);  // (1, 200)  ? 原值不受影響

劃重點: struct? 默認按值傳遞——方法內(nèi)部對參數(shù)的修改不會影響調(diào)用方的原始變量。這與 class 的行為正好相反。

二、重要陷阱:值類型包含引用類型成員

當結(jié)構(gòu)體內(nèi)部嵌套了引用類型(如 List<string>?),復制行為就變得有意思了——值類型實例被復制,但內(nèi)部的引用類型只復制了引用(地址) 。

 public struct TaggedInteger
 {
     public int Number;
     private List<string> tags;
 ?
     public TaggedInteger(int n)
     {
         Number = n;
         tags = new List<string>();
     }
 ?
     public void AddTag(string tag) => tags.Add(tag);
     public override string ToString() => $"{Number} [{string.Join(", ", tags)}]";
 }
 ?
 var n1 = new TaggedInteger(0);
 n1.AddTag("A");
 Console.WriteLine(n1);  // 0 [A]
 ?
 var n2 = n1;            // 復制結(jié)構(gòu)體
 n2.Number = 7;          // ? 只改 n2 的 Number(值類型成員)
 n2.AddTag("B");         // ?? tags 是 List<string>,n1 和 n2 共享同一個 List
 ?
 Console.WriteLine(n1);  // 0 [A, B]  ← n1 也被影響了!
 Console.WriteLine(n2);  // 7 [A, B]
  • ?Number?(int,值類型)→ 復制時獨立
  • ?tags?(List<string>?,引用類型)→ 復制時只復制引用,兩個結(jié)構(gòu)體實例共享同一個列表對象
操作?n1.Number?n1.tags?n2.Number?n2.tags
初始0List["A"]
?n2 = n10List["A"]0同一個List["A"]
?n2.Number = 70List["A"]7同一個List["A"]
?n2.AddTag("B")0List["A", "B"]7同一個List["A", "B"]

【提示】 官方明確建議:盡量使用不可變值類型。如果結(jié)構(gòu)體包含引用類型成員,一定要清楚這種"共享引用"的語義——這往往是 bug 的來源。

三、值類型的種類

C# 中的值類型有三種:

3.1 結(jié)構(gòu)類型(struct)

 public struct Point { public int X; public int Y; }

3.2 枚舉類型(enum)

 public enum Color { Red, Green, Blue }

3.3 聯(lián)合聲明(union)

定義一組封閉的事例類型,值可以表示。這是 .NET 6+ 引入的特性。

3.4 可為 null 的值類型(T?)

 int? nullableInt = null;      // Nullable<int>
 bool? nullableBool = null;    // Nullable<bool>

?T?? 表示 T? 的所有值 + null?。不能為 null? 的值類型變量無法賦 null。

3.5 泛型約束

 // struct 約束:類型參數(shù)必須是值類型(struct 或 enum)
 public class MyClass<T> where T : struct { }
 ?
 // System.Enum 約束:類型參數(shù)必須是枚舉類型
 public class MyClass<T> where T : System.Enum { }

四、內(nèi)置值類型(簡單類型)

C# 提供以下內(nèi)置值類型,也稱為簡單類型:

類別類型
整型?byte?,sbyte?,short?,ushort?,int?,uint?,long?,ulong?,nint?,nuint
浮點型?float?,double?,decimal
布爾?bool
字符?char

所有簡單類型都是結(jié)構(gòu)類型,但與其他結(jié)構(gòu)類型不同,它們允許一些額外操作:

操作簡單類型自定義結(jié)構(gòu)類型
文字常量?'A'?、2001?、12.34m?
??const??聲明?const int Max = 100;?
編譯期求值? 常量表達式在編譯時求值?
 // 簡單類型特有的操作
 const int MaxItems = 100;           // ? struct 是簡單類型
 const decimal TaxRate = 0.05m;      // ?
 ?
 // 以下 ? 編譯錯誤
 public struct Point { public int X; public int Y; }
 // const Point Origin = new Point();  // 不能聲明結(jié)構(gòu)類型的常量

五、值元組

值元組(ValueTuple<T1, T2>?)是值類型,但不是簡單類型。

var point = (X: 10, Y: 20);  // ValueTuple<int, int>

六、對比:值類型 vs 引用類型

維度值類型引用類型
變量內(nèi)容數(shù)據(jù)本身數(shù)據(jù)地址(引用)
賦值行為復制整個實例復制引用(地址)
默認傳參按值傳遞(副本)按值傳遞引用(同上仍是副本)
?null賦值? 不可(除非T?)?
存儲位置棧/內(nèi)聯(lián)
繼承?struct不能繼承?class可以
性能小數(shù)據(jù)快(無 GC 壓力)大數(shù)據(jù)好(引用傳遞)

最后: 值類型的行為可以用一句話概括——值類型變量就是數(shù)據(jù)本身。賦值即復制、傳參即復制、包含引用類型成員時要小心"共享引用"。這些規(guī)則雖然簡單,但組合起來卻影響著日常編碼中的每一個細節(jié)。記住官方建議:優(yōu)先用不可變值類型,代碼會更可靠。

到此這篇關(guān)于C# 中值類型的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)C# 值類型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論

巍山| 巴东县| 修文县| 东乌珠穆沁旗| 濮阳县| 会宁县| 北辰区| 福鼎市| 临湘市| 莱阳市| 新龙县| 防城港市| 温宿县| 商洛市| 兴海县| 洱源县| 和田市| 宁阳县| 巴彦县| 麦盖提县| 万州区| 衡东县| 襄汾县| 丘北县| 中牟县| 台安县| 岳阳市| 景谷| 三台县| 红安县| 无极县| 孝昌县| 河北省| 诸暨市| 曲水县| 石家庄市| 濉溪县| 宜都市| 博客| 翼城县| 延寿县|