系列目录
C# 提供了许多高级语言特性,使开发者能够编写更加灵活、简洁和高效的代码。在本节中,我们将探讨属性与索引器、操作符重载,以及匿名类型与动态类型的详细内容。这些特性不仅增强了C#语言的表达能力,还使代码更加清晰和易于维护。通过深入理解和应用这些特性,您将能够编写出更具表现力和功能强大的C#程序。
属性与索引器
属性是类中的成员,提供了对私有字段的封装。通过属性,可以控制对字段的访问,并添加逻辑来验证数据。
定义属性
public class Person
{
private string name;
// 属性
public string Name
{
get { return name; }
set
{
if (value.Length > 0)
name = value;
else
throw new ArgumentException("Name cannot be empty.");
}
}
}
public class Program
{
public static void Main(string[] args)
{
Person person = new Person();
person.Name = "Alice";
Console.WriteLine(person.Name);
}
}
在这个示例中,‘Name‘属性提供了对私有字段‘name‘的封装,并在设置属性值时进行验证。
自动属性
C# 还支持自动属性,简化了属性的定义。
public class Person
{
// 自动属性
public string Name { get; set; }
public int Age { get; set; }
}
索引器允许类实例像数组一样使用索引访问其内部数据。
定义索引器
public class SampleCollection<T>
{
private T[] arr = new T[100];
// 索引器
public T this[int i]
{
get { return arr[i]; }
set { arr[i] = value; }
}
}
public class Program
{
public static void Main(string[] args)
{
SampleCollection<string> collection = new SampleCollection<string>();
collection[0] = "Hello";
Console.WriteLine(collection[0]);
}
}
在这个示例中,‘SampleCollection‘类定义了一个索引器,使得类的实例可以通过索引访问内部数组‘arr‘。
操作符重载
操作符重载允许自定义类的对象使用C#的运算符进行操作。通过操作符重载,可以定义类的加减乘除等操作。
定义操作符重载
public class Complex
{
public double Real { get; set; }
public double Imaginary { get; set; }
public Complex(double real, double imaginary)
{
Real = real;
Imaginary = imaginary;
}
// 重载 + 运算符
public static Complex operator +(Complex c1, Complex c2)
{
return new Complex(c1.Real + c2.Real, c1.Imaginary + c2.Imaginary);
}
public override string ToString()
{
return $"{Real} + {Imaginary}i";
}
}
public class Program
{
public static void Main(string[] args)
{
Complex c1 = new Complex(1, 2);
Complex c2 = new Complex(3, 4);
Complex c3 = c1 + c2;
Console.WriteLine(c3);
}
}
在这个示例中,‘Complex‘类重载了‘+‘运算符,使得两个‘Complex‘对象可以相加。
匿名类型与动态类型
匿名类型
匿名类型允许定义包含一组只读属性的对象,而无需显式定义类型。
使用匿名类型
var person = new { Name = "Alice", Age = 25 };
Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");
在这个示例中,定义了一个包含‘Name‘和‘Age‘属性的匿名类型对象。
动态类型
动态类型(‘dynamic‘)允许在运行时确定对象的类型和成员。使用动态类型,可以编写更加灵活的代码。
使用动态类型
dynamic person = new { Name = "Alice", Age = 25 };
Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");
// 使用动态类型调用方法
dynamic calculator = new System.Dynamic.ExpandoObject();
calculator.Add = (Func<int, int, int>)((a, b) => a + b);
Console.WriteLine($"Addition: {calculator.Add(10, 20)}");
在这个示例中,动态类型‘person‘在运行时确定其类型和属性。通过‘ExpandoObject‘,可以动态添加方法。
总结
本节介绍了C#中的一些高级语言特性,包括属性与索引器、操作符重载,以及匿名类型与动态类型。通过属性和索引器,您可以更好地封装和管理类的内部数据。操作符重载使得自定义类可以更自然地使用运算符进行操作。匿名类型和动态类型则提供了更多的灵活性和动态行为。掌握这些特性后,您将能够编写更加灵活、简洁和高效的C#代码,提高开发效率和代码质量。在接下来的章节中,我们将继续探索更多关于C#的高级特性和编程技巧。
下一篇:白骑士的C#教学高级篇 3.2 文件与数据流