在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访问器为private
    public string Name
    {
        get { return _name; }      // 默认为public
        private 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访问器为private
    public 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 Doe
        person.ChangeName("Alice"); // 通过类内部方法修改
        Console.WriteLine(person.Name); // 输出: Alice
        // person.Name = "Bob"; // 编译错误,因为set是private
    }
}
(4) setprotected(允许派生类修改)
public class BasePerson
{
    private string _name;
    // 外层属性为protected,set访问器为protected
    protected 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#中属性的访问修饰符。

你可能感兴趣的:(ai学习参考,学习C#的笔记,c#,服务器)