get和set,?和 ?? ,?: ,?. ?:[]的用法和区别

C#中,getset 访问器通常与属性(property)一起使用,用于定义如何读取和写入属性的值。属性提供了一种比字段(field)更灵活的方式来封装类的数据成员。

区别

  1. 用途
    • get 访问器:用于读取属性的值。
    • set 访问器:用于设置属性的值。
  2. 返回值
    • get 访问器必须返回一个值,其类型必须与属性的声明类型相同。
    • set 访问器没有返回值(即返回类型为void),但它接受一个参数,该参数的类型必须与属性的声明类型相同。
  3. 执行时机
    • 当读取属性时,会执行 get 访问器中的代码。
    • 当给属性赋值时,会执行 set 访问器中的代码。
  4. 封装性
    • 使用 getset 访问器可以隐藏数据的实际存储和表示,并提供更复杂的读写逻辑(如验证、计算等)。

用法

以下是一个简单的示例,展示了如何在C#中使用 getset 访问器来定义属性:

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 是一个属性,它使用 getset 访问器来读取和设置 _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"

 

posted @ 2024-05-29 16:55  努力,努力再努力  阅读(31)  评论(0编辑  收藏  举报