C#类==>属性

本文介绍了C#中的属性概念,详细解释了属性如何模仿字段的行为,同时提供了只读、只写属性及不同访问级别的示例。此外,还探讨了自动实现属性的使用方法。

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

1,属性是C#从VB提取的,而不是C++或者JAVA。

 

2,在语法上更像是调用了一个字段,但实际上是调用了属性访问器。包括 get访问器和set访问器

 

3,set访问器不指定参数,但编译器会假定一个参数value.

 

4,VB6程序员注意:C#不区分Set和Let,总是用set.

 

5,属性的只读与只写

     在属性中省略set访问器,就可以创建只读属性

     在属性中省略get访问器,就可以创建只写属性

     ※这并不是一个好的编程方式,这样会使客户机代码的作者迷惑,如果要这么做,最好是用一个方法代替。

 

6,属性的访问修饰符

     C#允许给属性的get和set访问器设置不同的修饰符(private,protected等) 但不能同时为两个设置,必须有一个具备属性的访问级别,否则就会产生一个编译错误。

     如下:

 


 

        private string name;

       错误

        public string Name   
        {
            private
            get
            {
                return name;
            }
            private
            set
            {
           
                name = value;
            }
        }

 

        正确

        public string Name
        {
            private
            get
            {
                return _name;
            }
            set
            {
          
                _name = value;
            }
        }

 

 


 

 

7,属性定义的自动实现

     用自动实现的的属性,不需要声明关联的变量

     例如,6中定义的private string name; name变量,编译器会自动创建它。

     public string Name { get; set; }

 

      注意

      a,不能尝试设置只读属性 

      public string Name { get;  }会出错,

     

      b,可以使用访问修饰符,规则同上

       public string Name { private get; set; }

    

<think>嗯,我现在得仔细想想用户问的问题:C#里“=>”的用法。首先,我需要确认自己对C#中的这个符号的理解是否正确。记得在C#中,“=>”运算符通常用于两种场景:Lambda表达式和表达式体定义。不过可能还有其他用法吗?比如属性或者方法的简写? 首先,Lambda表达式。这部分应该没问题,比如在编写LINQ查询或者事件处理程序时,常用到Lambda,例如Func<int, int> square = x => x * x; 这里的“=>”把参数x映射到表达式x*x的结果。那用户可能已经见过这样的例子,但需要更详细的解释。 然后是表达式体成员(Expression-bodied members)。这是C# 6.0引入的特性,允许用箭头语法替代方法、属性等的传统块结构。例如,方法可以写成public int Add(int a, int b) => a + b; 这样更简洁。同样,属性可以用public string Name => firstName + " " + lastName; 这样的只读属性C# 7.0之后还扩展到了构造函数、析构函数、属性访问器等,但用户可能更关心常见的用法。 有没有其他情况使用“=>”?比如在switch表达式里,C# 8.0引入了switch表达式,这时候每个case用“=>”来返回值,例如var result = number switch { 1 => "One", 2 => "Two", _ => "Other" }; 这可能也是需要提到的点。不过用户的问题是否包括这个?可能需要说明,但可能用户主要问的是Lambda和表达式体成员。 另外,结构方面,用户要求分点回答,结构清晰。所以应该分点讲解,每个用法配上示例。同时,注意用中文,并且确保LaTeX格式正确,比如行内数学表达式用$...$,但这个问题可能不涉及数学公式,所以可能不需要。不过系统级指令里提到所有行内数学表达式必须用该格式,但用户的问题是关于C#语法的,可能没有数学表达式,所以可能这部分不需要处理,但需要注意其他格式要求,比如独立公式用$$...$$,但同样可能不适用。 需要检查是否有语法错误,比如Lambda表达式的正确写法,表达式体成员的正确使用场景。例如,表达式体方法只能用于单行表达式,不能用于有多个语句的情况。属性方面,表达式体属性C# 6中是只读的,而在C# 7中允许set访问器吗?或者可能不是,可能需要确认。例如,public string Name { get => name; set => name = value; } 这样的情况下,set访问器也可以用表达式体,这是C# 7.0的特性吗? 可能还需要提到,在基于表达式的成员中,构造函数和析构函数也可以使用,例如public MyClass(string name) => this.name = name; 但这用法是否常见?或者更多是方法、属性、索引器等。 另外,在Lambda表达式里,当有多个参数时需要用括号括起来,例如Func<int, int, int> add = (a, b) => a + b; 如果只有一个参数,可以省略括号,如x => x * x,但如果有零个或多个参数,则需要括号,比如() => Console.WriteLine("Hello")。 可能用户会混淆表达式体成员和Lambda表达式,所以需要明确区分两者的使用场景。例如,表达式体成员是用于简化方法或属性的定义,而Lambda表达式则是用于创建匿名函数或委托实例。 总结起来,回答的结构应该分为两个主要部分:Lambda表达式和表达式体成员,可能再加上switch表达式中的用法作为补充。每个部分给出定义、示例代码以及适用场景。同时,注意提到不同C#版本的差异,比如C# 6引入表达式体成员,后续版本扩展了其应用范围。 最后,确保示例代码正确,比如在表达式体属性中,是否允许set访问器,或者是否仅限于get访问器。例如,在C# 7.0中,可以使用表达式体的属性访问器: private string name; public string Name { get => name; set => name = value; } 这应该是有效的,所以需要包含这样的例子。这样用户能全面了解“=>”在不同上下文中的使用方式。</think>在C#中,`=>` 符号主要有以下用法,分为**Lambda表达式**和**表达式体成员**两。以下是详细说明和示例: --- ### 一、Lambda表达式 `=>` 用于定义 **Lambda表达式**(匿名函数),简化委托或表达式树的编写。 **语法**:`(参数列表) => 表达式或语句块` #### 1. 单行表达式 ```csharp // 输入参数为x,返回x的平方 Func<int, int> square = x => x * x; Console.WriteLine(square(5)); // 输出25 ``` #### 2. 多参数 ```csharp // 输入两个参数,返回它们的和 Func<int, int, int> add = (a, b) => a + b; Console.WriteLine(add(3, 4)); // 输出7 ``` #### 3. 无参数 ```csharp // 没有输入参数,返回固定值 Func<string> greet = () => "Hello, World!"; Console.WriteLine(greet()); // 输出Hello, World! ``` #### 4. 语句块(多行逻辑) ```csharp // 多行逻辑需要用{}包裹 Action<string> log = message => { Console.WriteLine($"[{DateTime.Now}] {message}"); File.AppendAllText("log.txt", message); }; log("Error occurred."); ``` --- ### 二、表达式体成员(Expression-bodied members) `=>` 用于简化**方法、属性等成员**的定义(C# 6.0+引入,后续版本扩展支持更多场景)。 #### 1. 方法 ```csharp // 单行方法 public int Sum(int a, int b) => a + b; ``` #### 2. 只读属性 ```csharp // 计算属性(无setter) public string FullName => $"{FirstName} {LastName}"; ``` #### 3. 属性访问器(C# 7.0+) ```csharp private string _name; public string Name { get => _name; set => _name = value ?? "Default"; // 简化set逻辑 } ``` #### 4. 构造函数/析构函数(C# 7.0+) ```csharp // 构造函数初始化 public class Person { private string _name; public Person(string name) => _name = name; } ``` #### 5. 索引器(C# 7.0+) ```csharp private string[] _data = new string[10]; public string this[int index] { get => _data[index]; set => _data[index] = value; } ``` --- ### 三、Switch表达式(C# 8.0+) 在**模式匹配**中,`=>` 用于映射匹配结果: ```csharp var result = number switch { 1 => "One", 2 => "Two", _ => "Other" }; ``` --- ### 总结 | 场景 | 示例 | 说明 | |----------------------|------------------------------------------|-------------------------------| | Lambda表达式 | `x => x * x` | 创建匿名函数或委托 | | 表达式体方法 | `int Sum(int a, int b) => a + b;` | 单行方法简化 | | 表达式体属性 | `string FullName => $"{First} {Last}";` | 只读属性 | | Switch表达式 | `_ => "Other"` | 匹配默认情况 | **注意**: - Lambda表达式常用于LINQ查询、事件处理等场景。 - 表达式体成员需保持逻辑简单(单行表达式)。 - 不同C#版本支持的功能可能不同(如C# 6.0仅支持方法和只读属性)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值