在C#中 属性(Properties)get 和 set

在C#中,属性(Properties)是一种特殊的方法,用于封装类、结构或接口中的字段。属性允许你控制对字段的访问,并可以在设置或获取值时执行额外的逻辑。属性通常由两个访问器组成:getset

基本属性定义

public class Person
{private string name;public string Name{get { return name; }set { name = value; }}
}

在这个例子中,Name 是一个属性,它封装了一个私有字段 nameget 访问器用于返回字段的值,set 访问器用于设置字段的值。

自动实现的属性

C# 还提供了自动实现的属性,这是一种更简洁的写法,适用于不需要额外逻辑的情况。

public class Person
{public string Name { get; set; }
}

在这个例子中,编译器会自动生成一个私有字段来存储 Name 的值。

只读属性

如果只需要 get 访问器,属性就是只读的。

public class Person
{private string name;public string Name{get { return name; }}
}

或者使用自动实现的只读属性:

public class Person
{public string Name { get; }
}

只写属性

如果只需要 set 访问器,属性就是只写的。

public class Person
{private string name;public string Name{set { name = value; }}
}

属性中的逻辑

你可以在 getset 访问器中添加额外的逻辑。

public class Person
{private string name;public string Name{get { return name.ToUpper(); // 在获取时转换为大写}set { if (!string.IsNullOrEmpty(value)){name = value; // 只在值不为空时设置}}}
}

示例使用

class Program
{static void Main(){Person person = new Person();person.Name = "John Doe"; // 设置属性Console.WriteLine(person.Name); // 输出 "JOHN DOE"}
}

总结

  • 基本属性:显式定义 getset 访问器。
  • 自动实现的属性:简化写法,适用于简单属性。
  • 只读属性:只有 get 访问器。
  • 只写属性:只有 set 访问器。
  • 逻辑属性:在 getset 中添加额外逻辑。
    通过属性,你可以更好地控制对类字段的访问,并在需要时添加验证或转换逻辑。

可以为属性的getset访问器分别设置不同的访问修饰符,这样能够更灵活地控制属性的访问权限。以下是详细说明和示例代码:

1. 基本语法

在C#中,属性的getset访问器可以单独设置访问修饰符,例如publicprivateprotectedinternal等。但需要注意以下几点:

  • 外层属性必须有一个访问修饰符(如public)。
  • getset中只能有一个访问器可以单独设置修饰符,不能同时设置。
示例:
public class Person
{private string _name;// 外层属性为public,set访问器为privatepublic string Name{get { return _name; }      // 默认为publicprivate set { _name = value; } // 只允许在类内部修改}
}

2. 详细说明

(1) 外层属性修饰符

外层属性修饰符决定了属性的基本访问级别。例如,如果外层是public,则默认情况下getset也是public,除非单独指定。

(2) 单独设置getset的访问修饰符
  • 可以单独为getset设置访问修饰符,但不能同时设置。
  • 例如,set可以设置为private,这样外部代码只能读取属性值,而不能修改它。
(3) 常用场景
  • 只读属性:只设置get访问器,或设置setprivate
  • 只写属性:只设置set访问器,或设置getprivate
  • 受保护属性:设置setprotected,允许派生类修改属性。

3. 示例代码

(1) 只读属性(外部只能读取,不能修改)
public class Person
{private string _name = "John Doe";// 外层属性为public,但set访问器不存在public string Name{get { return _name; }}
}
// 使用示例
public class Program
{public static void Main(){Person person = new Person();Console.WriteLine(person.Name); // 输出: John Doe// person.Name = "Alice"; // 编译错误,因为set访问器不存在}
}
(2) 只写属性(外部只能修改,不能读取)
public class Person
{private string _name;// 外层属性为public,但get访问器不存在public string Name{set { _name = value; }}
}
// 使用示例
public class Program
{public static void Main(){Person person = new Person();person.Name = "Alice"; // 可以设置// Console.WriteLine(person.Name); // 编译错误,因为get访问器不存在}
}
(3) setprivate(外部只能读取,类内部可以修改)
public class Person
{private string _name = "John Doe";// 外层属性为public,set访问器为privatepublic string Name{get { return _name; }private set { _name = value; }}public void ChangeName(string newName){Name = newName; // 类内部可以修改}
}
// 使用示例
public class Program
{public static void Main(){Person person = new Person();Console.WriteLine(person.Name); // 输出: John Doeperson.ChangeName("Alice"); // 通过类内部方法修改Console.WriteLine(person.Name); // 输出: Alice// person.Name = "Bob"; // 编译错误,因为set是private}
}
(4) setprotected(允许派生类修改)
public class BasePerson
{private string _name;// 外层属性为protected,set访问器为protectedprotected string Name{get { return _name; }protected set { _name = value; }}
}
public class DerivedPerson : BasePerson
{public void SetName(string newName){Name = newName; // 派生类可以修改}
}
// 使用示例
public class Program
{public static void Main(){DerivedPerson person = new DerivedPerson();person.SetName("Alice"); // 通过派生类修改// Console.WriteLine(person.Name); // 编译错误,因为get是protected}
}

4. 总结

  • 在C#中,可以为属性的getset访问器分别设置不同的访问修饰符。
  • 外层属性必须有一个访问修饰符,而getset中只能有一个访问器可以单独设置修饰符。
  • 这种特性可以用于实现更精细的访问控制,例如只读属性、只写属性或受保护的属性。
    以上示例和说明可以帮助你更好地理解和使用C#中属性的访问修饰符。