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

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

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

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

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

一、核心行為:賦值即復(fù)制

值類型的變量直接包含類型實(shí)例,賦值時(shí)復(fù)制整個(gè)實(shí)例。

 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;       // 復(fù)制整個(gè)結(jié)構(gòu)體
 p2.Y = 200;        // 只影響 p2
 ?
 Console.WriteLine(p1);  // (1, 2)  ? p1 不受影響
 Console.WriteLine(p2);  // (1, 200)

方法傳參也是復(fù)制:

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

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

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

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

 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;            // 復(fù)制結(jié)構(gòu)體
 n2.Number = 7;          // ? 只改 n2 的 Number(值類型成員)
 n2.AddTag("B");         // ?? tags 是 List<string>,n1 和 n2 共享同一個(gè) List
 ?
 Console.WriteLine(n1);  // 0 [A, B]  ← n1 也被影響了!
 Console.WriteLine(n2);  // 7 [A, B]
  • ?Number?(int,值類型)→ 復(fù)制時(shí)獨(dú)立
  • ?tags?(List<string>?,引用類型)→ 復(fù)制時(shí)只復(fù)制引用,兩個(gè)結(jié)構(gòu)體實(shí)例共享同一個(gè)列表對(duì)象
操作?n1.Number?n1.tags?n2.Number?n2.tags
初始0List["A"]
?n2 = n10List["A"]0同一個(gè)List["A"]
?n2.Number = 70List["A"]7同一個(gè)List["A"]
?n2.AddTag("B")0List["A", "B"]7同一個(gè)List["A", "B"]

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

三、值類型的種類

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? 的值類型變量無(wú)法賦 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)置值類型(簡(jiǎn)單類型)

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

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

所有簡(jiǎn)單類型都是結(jié)構(gòu)類型,但與其他結(jié)構(gòu)類型不同,它們?cè)试S一些額外操作:

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

五、值元組

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

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

六、對(duì)比:值類型 vs 引用類型

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

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

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

相關(guān)文章

最新評(píng)論

上林县| 富平县| 云阳县| 尤溪县| 恩施市| 兴和县| 大田县| 福鼎市| 杭州市| 开平市| 阿图什市| 大连市| 乃东县| 留坝县| 政和县| 清原| 铜梁县| 武义县| 竹溪县| 东丰县| 长葛市| 会宁县| 常州市| 太谷县| 宜章县| 泸溪县| 天门市| 香格里拉县| 邵东县| 嵊泗县| 准格尔旗| 阳城县| 缙云县| 永丰县| 德庆县| 常德市| 虎林市| 宁陵县| 上栗县| 阆中市| 中江县|