get和set,?和 ?? ,?: ,?. ?:[]的用法和区别
get
和 set
访问器通常与属性(property)一起使用,用于定义如何读取和写入属性的值。属性提供了一种比字段(field)更灵活的方式来封装类的数据成员。
区别
- 用途:
get
访问器:用于读取属性的值。set
访问器:用于设置属性的值。
- 返回值:
get
访问器必须返回一个值,其类型必须与属性的声明类型相同。set
访问器没有返回值(即返回类型为void
),但它接受一个参数,该参数的类型必须与属性的声明类型相同。
- 执行时机:
- 当读取属性时,会执行
get
访问器中的代码。 - 当给属性赋值时,会执行
set
访问器中的代码。
- 当读取属性时,会执行
- 封装性:
- 使用
get
和set
访问器可以隐藏数据的实际存储和表示,并提供更复杂的读写逻辑(如验证、计算等)。
- 使用
用法
以下是一个简单的示例,展示了如何在C#中使用 get
和 set
访问器来定义属性:
public class Person { // 私有字段,用于存储姓名 private string _name; // 属性:Name // 使用 get 访问器来读取 _name 字段的值 // 使用 set 访问器来设置 _name 字段的值 public string Name { get { return _name; } set { // 可以在这里添加验证逻辑,例如检查名称是否为空或长度是否合适 if (string.IsNullOrWhiteSpace(value)) { throw new ArgumentException("Name cannot be null or whitespace."); } _name = value; } } // 类的其他成员... } // 使用示例 Person person = new Person(); person.Name = "Alice"; // 调用 set 访问器 string name = person.Name; // 调用 get 访问器 Console.WriteLine(name); // 输出 "Alice"
Name
是一个属性,它使用 get
和 set
访问器来读取和设置 _name
字段的值。在 set
访问器中,我们添加了一个简单的验证逻辑,以确保名称不为空或只包含空白字符。如果尝试将空或只包含空白字符的字符串分配给 Name
属性,则会抛出一个 ArgumentException
异常。
?
(单独使用时)通常不是一个特定的编程语言的运算符或符号,但在某些上下文中,它可能被用作表示疑问或作为占位符。然而,对于其他符号,我将解释它们在C#和某些其他编程语言中的用法和区别。
??
- 空合并运算符(Null-conditional Operator)
在C#中,??
是一个空合并运算符。它用于检查左侧的操作数是否为 null
。如果是,则返回右侧的操作数;否则,返回左侧的操作数。
int? a = null; int b = a ?? 10; //左边a等于空的时候,10赋值给a a = 5; b = a ?? 10; // b 等于 5 不为空
?:
- 条件运算符(Conditional Operator)或三元运算符(Ternary Operator)
条件运算符用于根据条件返回两个值之一。它的格式是 condition ? value_if_true : value_if_false
。
int a = 5; int b = 10; int max = (a > b) ? a : b; // max is 10
?.
- 空条件运算符(Null-conditional Access Operator)
在C#中,?.
是一个空条件运算符,用于在访问成员(属性、方法等)之前检查对象是否为 null
。如果对象是 null
,则整个表达式的结果也是 null
,而不会抛出 NullReferenceException
异常。
Person person = null; string name = person?.Name; // name is null because person is null
?.[]
- 空条件索引器访问
与 ?.
类似,但用于索引器(例如数组或集合的索引)。如果对象是 null
,则不会尝试访问索引器,而是整个表达式的结果为 null
。
List<string> list = null; string item = list?[0]; // item is null because list is null
注意:在C#中,你不能直接将 ?.
和 []
结合使用(如 ?.[]
),但你可以这样写 list?.[0]
(尽管这是无效的语法)。通常,你会先使用 ?.
检查对象是否为 null
,然后再访问索引器,如上面的示例所示。
[]
- 索引器(Indexer)
索引器允许类或结构的实例像数组一样被索引。它们通常用于提供对集合中元素的访问,但也可以用于提供对对象的任何类型的字段或属性的访问
List<string> list = new List<string> { "a", "b", "c" }; string item = list[1]; // item is "b"