白骑士的C#教学高级篇 3.1 高级语言特性

21 篇文章 1 订阅

系列目录

上一篇:白骑士的C#教学进阶篇 2.5 异步编程

        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 文件与数据流​​​​​​​

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

白骑士所长

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

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

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

打赏作者

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

抵扣说明:

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

余额充值