C#中的字段与属性

using System;
using System.Collections.Generic;
using System.Text;

namespace Example11_1 {
class Program {
static void Main(string[] args) {
Farmer farmer = new Farmer();
farmer.Name = "Liu";
farmer.Age = 226;

Console.WriteLine(farmer.Age);

Console.ReadLine();
}
}

class Farmer {
/// <summary>
/// Farmer类的无参数构造函数
/// </summary>
public Farmer() {
}

/// <summary>
/// Farmer类的构造函数
/// </summary>
/// <param name="m_Name">Farmer的姓名参数</param>
public Farmer(string m_Name) {
name = m_Name;
}

/// <summary>
/// 姓名字段
/// </summary>
string name = string.Empty;

/// <summary>
/// max字段
/// </summary>
const int max = 150;

/// <summary>
/// min字段
/// </summary>
const int min = 0;

/// <summary>
/// 年龄字段
/// </summary>
int age = 0;

/// <summary>
/// Max属性
/// </summary>
public int Max {
get {
return max;
}
}

/// <summary>
/// Min属性
/// </summary>
public int Min
{
get
{
return min;
}
}

/// <summary>
/// Name属性
/// </summary>
public string Name {
set {
name = value;
}
}

/// <summary>
/// 年龄属性
/// </summary>
public int Age {
get {
return age;
}
set {
if ((value > min) && (value < max))
{
age = value;
}
else
{
try
{
Exception ex = new Exception("设置的值超出预设范围!");
throw (ex);
}
catch
{

Console.WriteLine("设置的值超出预设范围!");

}
}
}
}
}

}

C# 中,字段(Fields)和属性(Properties)是类中用于存储数据的两种不同机制,它们在功能、封装性、可维护性和访问控制方面存在显著差异。 字段是类中的成员变量,直接存储数据。字段的访问通常是直接的,没有内置的机制来控制对数据的读取或写入。例如,定义一个字段可以如下所示: ```csharp public class Person { public string Name; // 字段 } ``` 字段的使用虽然简单,但在实际开发中并不推荐直接暴露类的内部状态,因为这会降低封装性和可维护性。 属性则是通过访问器(get 和 set 方法)来间接存储和访问数据的机制。属性提供了对数据的封装,可以在 get 和 set 方法中添加验证逻辑或其他操作,从而增强程序的安全性和灵活性。例如: ```csharp public class Person { private string _name; public string Name { get { return _name; } set { _name = value; } } } ``` C# 3.0 引入了自动实现的属性(Auto-Implemented Properties),简化了属性的定义方式。在这种情况下,编译器会自动生成一个隐藏的字段,开发者不需要手动编写字段的存储逻辑。例如: ```csharp public string Name { get; set; } // 自动属性 ``` ### 主要区别 | 特性 | 字段(Fields) | 属性(Properties) | |--------------------|----------------------------------------|------------------------------------------------| | **数据存储** | 直接存储数据 | 通过访问器间接存储数据 | | **访问控制** | 仅能通过访问修饰符控制整体访问权限 | 可以分别控制 get 和 set 的访问权限 | | **封装性** | 不提供封装 | 提供封装,可以在 get 和 set 中添加逻辑 | | **可维护性** | 可维护性较低 | 可维护性较高 | | **语法** | 直接定义变量 | 使用 get 和 set 关键字 | ### 使用建议 在实际开发中,属性通常比字段更受青睐,因为属性提供了更好的封装性和灵活性。通过属性,可以在 get 和 set 方法中添加验证逻辑,确保数据的正确性和安全性。例如,在设置属性值时,可以检查输入是否符合预期: ```csharp private string _name; public string Name { get { return _name; } set { if (string.IsNullOrEmpty(value)) { throw new ArgumentException("Name cannot be null or empty."); } _name = value; } } ``` 而字段通常用于类的内部实现细节,或者在需要高性能的场景下使用,因为字段的访问速度比属性更快,因为属性需要调用方法。 总之,字段属性各有用途,但在大多数情况下,属性是更优的选择,因为它提供了更强的封装性和灵活性[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值