C#类型和变量——两种类型

本文详细介绍了C#中的值类型和引用类型的区别,包括它们如何存储数据、操作的影响及常见的误解。同时概述了C#类型系统的组成部分,如简单类型、枚举类型、构造类型等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

类型和变量这一块内容挺多额,好像昨天面试的时候被面试到了,忘了(好糗!)


C#里有两种类型:

值类型(value types):

a,值类型的变量直接包含它们的数据

b,每个变量拥有自己的副本,所以对其操作不会影响另一个(except ref 和 out 参数变量)。

引用类型(reference typeset):

a,引用类型的变量保存的是它们对数据的引用,也成为对象。

b,两个变量完全可能引用同一个对象,所以对一个变量的操作会影响另一个引用此对象的变量。


误区:值类型存储在”栈“中,引用类型存储在”堆“中。(来自ERIC LIPPERT的分析)

解释:a,这只描述了两种类型运行时实现细节的差别,并非关于语言本质的差别。

     b,本身不正确,与引用类型相关联的数据的确存储在堆中,但这些数据也可能包含值类型的实例,因此值类型也可能存储在堆中。

真正的区别:值类型是按值复制而引用类型仅仅复制引用。


C#的类型系统:

值类型:

简单类型(Simple):带符号整数,无符号整数,Unicode字符,IEEE标准浮点数,高精度数值,布尔值

枚举类型(enum)

构造类型(struct)

空属类型(nullable)

引用类型:

类类型(class)

接口类型(interface)

数组类型(array)

委托类型(delegate)


补充:

(来自CHRISTIAN NAGEL)

C++程序所面临的一个问题是,规范中没有定义short,int,long类型数据所占的字节个数,导致在16位,32位,64位机器上占用不同的字节空间。

而C#则明确规定了数值类型数据的长度,该长度与平台无关。

### C# 中 `List<T>` 是否可以存储多种类型的元素 `List<T>` 是一种泛型集合,在设计上它只允许存储单一类型的元素[^3]。这意味着当你声明一个 `List<int>` 时,该列表仅能容纳整数类型的值;同样地,对于 `List<string>` 则只能存储字符串。 然而,可以通过一些技巧来实现看似能够存储多种类型的场景: #### 方法一:使用基类或接口作为类型参数 通过将 `object` 或者某种公共接口(如 `IComparable`)设置为类型参数,可以让 `List<T>` 容纳不同的数据类型。这是因为所有的 .NET 对象都继承自 `object` 类型,所以实际上你可以向这样的列表中添加任意类型的对象。 ```csharp using System; using System.Collections.Generic; class Program { static void Main() { List<object> mixedList = new List<object>(); mixedList.Add(42); // 整数 mixedList.Add("Hello"); // 字符串 mixedList.Add(new DateTime()); // 日期时间 foreach (var item in mixedList) { Console.WriteLine(item); } } } ``` 这种方法虽然可行,但在实际操作过程中需要注意每次取出元素都需要重新进行显式的类型转换才能进一步处理这些异构的数据项[^1]。 #### 方法二:定义包含联合字段的结构体或者类 另一种方式是创建一个新的复合类型,其中包含了可能需要保存的各种不同类型成员变量一个子集,并利用这个新类型作为 `List<T>` 的模板参数。 ```csharp public class MixedData { public int? Number { get; set; } public string Text { get; set; } public override string ToString(){ return $"Number:{this.Number},Text:{this.Text}"; } } // Usage Example: List<MixedData> dataList = new List<MixedData>{ new MixedData{Number=1}, new MixedData{Text="Sample"} }; foreach(var data in dataList){ Console.WriteLine(data.ToString()); } ``` 此方案提供了更强的安全性可读性,同时也避免了频繁强制转型带来的风险不便之处[^4]。 尽管如此,仍需强调的是真正的强类型保障机制下并不推荐直接混合储存完全无关的不同类别实体于同一个容器之中——除非确实存在明确业务逻辑需求支持这样做[^2]。 ### 结论 综上所述,标准意义上的C#中的`List<T>`不允许直接存入多个不同种类的对象实例。但是借助某些间接手段比如采用Object做为泛型实参或是构建专门用于封装多重属性的新类型,则能够在一定程度达成类似效果的同时兼顾部分优势特性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值