补点C#基础_09_属性_定义、设置,取值和访问字段

本文详细介绍了C#中属性的概念及其使用方法。包括属性的基本定义、如何通过属性访问字段,以及在设置值前进行验证的方法。通过示例展示了属性的set和get块的运用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、属性的定义,
1.1设置,取值。
public class Vector3
{
public int MyProtity
{
set
{
Console.WriteLine(“属性中的set块被调用”);
Console.WriteLine(“在set块中访问value的值是”+value);
}
get
{
Console.WriteLine(“属性中的get块被调用了”);
return 100;
}
}

}
1.2、设置,取值
static void Main(string[] args)
{
Vector3 v1 = new Vector3();
v1.MyProtity = 600;//对属性设置值。
int t = v1.MyProtity;//对属性取值。

Console.ReadKey();
}

1.3结果
在这里插入图片描述
2、通过属性来访问字段。
2.1
public class Vector3
{
private float x;//字段
public float X
{
get
{
return x;
}
set
{
x = value;
}

}
}

static void Main(string[] args)
{
Vector3 v1 = new Vector3();
v1.X = 100;
float temp = v1.X;

Console.WriteLine(temp);
Console.ReadKey();
}

2.2结果:
在这里插入图片描述2.3
2.3.1
通过set方法,在设置之前做一些检验工作
private int age;
public int Age
{
set
{
if (value>=0)
{
//通过set方法,在设置之前做一些检验工作,
age = value;
}

}
}

<think>好的,我现在需要帮用户创建一个PersonC#示例。首先,用户可能想要一个基本的结构,包含字段方法。但得确定用户的具体需求,比如是否需要属性、构造函数,或者特定功能的方法。 用户可能对C#的面向对象概念有一定了解,但不确定如何组织代码。需要确保示例清晰,结构良好,符合最佳实践。通常,公共字段应该用属性封装,所以应该使用自动属性或者带有私有字段属性。 接下来考虑字段。常见的Person可能有姓名、年龄、性别等。但性别可能需要枚举型,这样更规范。然后,方法方面,可能需要自我介绍的方法,计算出生年份的方法,验证年龄有效性的方法,以及更新信息的方法。 构造函数也是必要的,方便初始化对象。可能需要重载构造函数,提供不同方式的初始化。另外,年龄的有效性检查应该在属性设置器中处理,或者在方法中处理,避免无效数据。 还要考虑代码的可读性规范性,比如方法命名使用有意义的动词,属性首字母大写,遵循Pascal命名规则。同时,示例代码应该完整,可以直接运行测试,方便用户理解使用。 可能用户需要这个Person用于教学示例或者项目中的基础结构,所以需要确保代码健壮,包含异常处理数据验证。比如设置年龄时,如果传入负数,应该抛出异常或者自动调整,这里可能采用抛出异常的方式更合适。 另外,是否需要静态方法?比如计算出生年份可能需要当前年份减去年龄,但当前年份的获可能有依赖,这里直接使用DateTime.Now.Year,虽然简单,但需要注意其正确性。 最后,提供使用示例,展示如何创建实例、调用方法,这样用户能清楚看到效果。同时总结关键,帮助用户抓住重,比如封装、数据验证、方法设计等。</think>以下是一个符合C#规范的Person实现,包含常用字段、方法最佳实践: ```csharp /// <summary> /// 表示一个人的基本信息实体 /// </summary> public class Person { // 字段:使用属性封装(小写开头命名) private string _firstName; private string _lastName; private DateTime _birthDate; // 枚举定义 public enum GenderType { Male, Female, Other } // 自动属性(PascalCase命名) public GenderType Gender { get; set; } // 完整属性(带验证) public int Age { get { var today = DateTime.Today; int age = today.Year - _birthDate.Year; if (_birthDate.Date > today.AddYears(-age)) age--; return age; } } // 构造函数重载 public Person(string firstName, string lastName, DateTime birthDate, GenderType gender) { _firstName = firstName ?? throw new ArgumentNullException(nameof(firstName)); _lastName = lastName ?? throw new ArgumentNullException(nameof(lastName)); if (birthDate > DateTime.Now) throw new ArgumentException("出生日期不能晚于当前时间"); _birthDate = birthDate; Gender = gender; } // 方法:获全名 public string GetFullName() => $"{_lastName} {_firstName}"; // 方法:年龄验证 public bool IsAdult(int legalAge = 18) => Age >= legalAge; // 方法:信息更新 public void UpdateName(string newFirstName, string newLastName) { if (!string.IsNullOrWhiteSpace(newFirstName)) _firstName = newFirstName; if (!string.IsNullOrWhiteSpace(newLastName)) _lastName = newLastName; } // 重写ToString方法 public override string ToString() => $"{GetFullName()}, {Gender}, 年龄: {Age}岁, 出生日期: {_birthDate:yyyy-MM-dd}"; } // 使用示例 var person = new Person("小明", "张", new DateTime(1995, 3, 20), Person.GenderType.Male); Console.WriteLine(person.ToString()); // 输出:张 小明, Male, 年龄: 29岁, 出生日期: 1995-03-20 Console.WriteLine(person.IsAdult()); // 输出:True person.UpdateName("大明", null); Console.WriteLine(person.GetFullName()); // 输出:张 大明 ``` ### 🔑 关键设计: 1. **封装性**:所有字段私有,通过属性/方法访问 2. **数据验证**: - 构造函数参数空检查 - 出生日期有效性验证 - 姓名更新空过滤 3. **计算属性**:Age属性动态计算实际年龄 4. **方法重载**:IsAdult方法提供默认法定年龄参数 5. **枚举型**:规范性别取值范围 6. **文化友好**:中文命名+英文代码混合风格 ### 🛠️ 扩展建议: 1. 添加`Email`属性(需正则验证) 2. 实现`IComparable<Person>`接口进行排序 3. 添加`SerializeToJson()`序列化方法 4. 创建派生(如`Employee`继承`Person`)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

unity学习社区

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值