C#基础 [09] 属性

技术周总结 09.09~09.15周日(C# WinForm WPF 软件架构) 是 Windows Forms 中控件的一部分,用于表示控件中的所有行的集合。是一个非常强大的控件,可以用来显示和管理数据表格。以下是一些常用的。 阅读详情

C#基础 [09] 属性

一、属性的定义和特征

  1.属性的定义

    属性是表示类或类的实例中的一个数据项的成员:它提供灵活的机制来读取、编写或计算某个私有字段的值。可以像使用公共数据成员一样使用属性,但实际上它们是称作“访问器”的特殊方法。这使得可以轻松访问数据,此外还有助于提高方法的安全性和灵活性。

  2.属性的特征

    1).属性是命名的类成员,它有类型,可以被赋值和读取。

    2).与字段不同,属性是一个函数成员;它本身没有任何存储,不为数据存储分配内存;它执行代码。

    3).属性有两个匹配的、称为访问器的方法:set访问器为属性赋值,get访问器从属性中获取值。

    4).在使用属性时,属性访问器被隐式调用:当为属性赋值时,set访问器被隐式调用;当从属性中读取值时,get访问器被隐式调用;不能显式调用访问器。

  3.属性的示例   

复制代码
 1     class TimePeriod
 2     {
 3         // 声明一个后备字段
 4         private double seconds;
 5 
 6         // 声明一个doub类型的属性,在属性内部将小时转换为秒
 7         public double Hours
 8         {
 9             // get访问器:返回属性类型的值
10             get { return seconds / 3600; }
11             // set访问器:为属性赋值
12             set { seconds = value * 3600; }
13         }
14     }    
15 
16     class Program
17     {
18         static void Main(string[] args)
19         {
20             TimePeriod t = new TimePeriod();
21 
22             // 为属性赋值,隐式调用set访问器.
23             t.Hours = 24;
24 
25             // 读取属性值,隐式调用get访问器.
26             System.Console.WriteLine("Time in hours: " + t.Hours);
27         }
28     }
复制代码

二、属性访问器

  属性的访问器就是两个方法,set访问器和get访问器有预定义的语法和语义。我们按照预定义的语法声明的属性,经过编译器编译之后,会自动分别为set访问器和get访问器生成相应的方法。编译器生成的方法经过反编译可以看得一清二楚。下面是我用Reflector反编译上例中的TimePeriod类之后,它的Hours属性的结构:

  可以看到,编译器为Hours属性生成了一个返回值类型为void的方法名为set_Hours的方法,一个返回值类型为double的get_Hours方法。

  1.set访问器

    从上图已经可以看到了属性内部的结构。这里再来进一步分析属性所生成的setHours方法内部的秘密。经过反编译之后的set_Hours方法的内部代码如下:

1 public void set_Hours(double value)
2 {
3     this.seconds = value * 3600.0;
4 }

    从上面代码中我们可以分析得出set访问器的特征:

      1).set访问器有一个单独的、隐式的值参数,参数名称为value,参数类型与属性的类型相同。

      2).set访问器的返回类型为void。

  2.get访问器

    下面是get_Hours方法的内部实现代码:

1 public double get_Hours()
2 {
3     return (this.seconds / 3600.0);
4 }

    get访问器的特征:

      1).get访问器没有参数。

      2).get访问器有一个与属性类型一致的返回值类型。

      3).get访问器的所有执行路径必须有一条return语句,返回属性类型的值。

三、属性和关联字段

  1.属性通常和字段关联,字段存储实际的数据,而属性为字段提供了一种访问渠道。通常的做法是:在类中将字段声明为private,并且为字段声明一个public属性以提供受控的从类的外部对字段的访问。和属性关联的字段称为“后备字段"。

  2.属性和后备字段有两种命名约定:

    第一种:后备字段采用camel命名法,而属性采用字段的Pascal命名版本。

    第二种:属性命名不变,仍然使用Pascal命名法,字段采用"下划线+camel"的形式。

   3.下面是另一个示例:该示例声明了一个名为Student的类,该类的每个属性都有一个采用了“_+camel”命名的后备字段。其中类成员声明按照:Fields—>Methods->Properties的顺序进行。

复制代码
 1 using System;
 2 namespace MyClass
 3 {
 4     class Student
 5     {
 6         // Fields
 7         private string _name;
 8         private string _sex;
 9         private int _age;
10         private float _chinese;
11         private float _math;
12         private float _english;
13 
14         // Constructor
15         public Student()
16         {
17 
18         }
19 
20         // Methods
21         public void SayHello()
22         {
23             System.Console.WriteLine("我叫{0},今年{1}岁了,是{2}同学", this.Name, this.Age, this.Sex);
24         }
25         
26         /// <summary>
27         /// 总成绩
28         /// </summary>
29         /// <returns></returns>
30         public float Sum()
31         {
32             return this.Chinese + this.Math + this.English;
33         }
34 
35         /// <summary>
36         /// 平均成绩
37         /// </summary>
38         /// <returns></returns>
39         public float Average()
40         {
41             return (this.Chinese + this.Math + this.English) / 3f;
42         }
43 
44         // Properties
45         public string Name
46         {
47             get { return this._name; }
48             set { this._name = value; }
49         }
50 
51         public string Sex
52         {
53             get { return _sex; }
54             set { _sex = value; }
55         }
56 
57         public int Age
58         {
59             get { return _age; }
60             set { _age = value; }
61         }
62 
63         public float Chinese
64         {
65             get { return _chinese; }
66             set { _chinese = value; }
67         }
68 
69         public float Math
70         {
71             get { return _math; }
72             set { _math = value; }
73         }
74 
75         public float English
76         {
77             get { return _english; }
78             set { _english = value; }
79         }
80     }
81 }
复制代码

四、只读属性和只写属性

  1.只读属性:只有get访问器的属性称为只读属性。该属性使得只能将一项数据从类或类的实例传出,而不能有其它访问。

        public string Name
        {
            get { return this._name; }             
        }

  2.只写属性:只有set访问器的属性称为只写属性。该属性值允许数据从类的外部传入类。

1         public string Name
2         {
3             set { this._name = value; }
4         }

  3.属性必须有至少一个访问器,要么既可读、又可写,要么提供一个。不然编译器会报错。下面是我将Name属性的set访问器和get访问器都去掉之后报的一条错误消息:

五、属性与公共字段的比较

  属性结合了字段和方法的多个方面。对于对象,属性显示为字段,访问属性需要与访问字段相同的语法。对于类的实现者(类本身),属性是一个或两个代码块,表示一个 get 访问器和/或一个 set 访问器。访问器可以对数据的访问提供一些限制和流程控制。

  以下两点表明在实际编码中使用属性更好、更灵活:

    1.字段是数据成员,只有存储能力,没有处理数据能力;而属性是函数成员,可以通过访问器对数据的输入输出进行控制。

    2.程序编译之后,字段和属性的语义不同。

六、自动实现属性

  1.从C#3.0中增加了自动实现属性(automatically implemented property),自动属性就是只声明属性而不声明后备字段,编译器会自动创建隐式的后备字段,并且自动与set和get访问器相关联。当属性的访问器中不需要其他逻辑时,自动实现的属性可使属性声明更加简洁。实际开发中,很多都是使用自动属性的。

  2.自动实现属性的特征:

    1).不必声明后备字段,编译器会根据属性的类型自动生成隐式的后备字段来存储数据。

    2).不能提供访问器的方法体,set访问器和get访问器的方法体被一个分号代替。这也是符合逻辑的,因为都不知道后备字段是什么,当然无法对它提供访问控制了,这一切都交给了编译器。

    3).必须同时提供读写属性,缺一不可。

  3.示例

复制代码
1         // 自动实现属性
2         public string Name
3         {
4             // 只有简单的get;和set;没有提供方法体
5             get;
6             set;
7         }
复制代码

  4.自动实现属性的内部实现

复制代码
 1 // 由编译器生成的set访问器
 2 [CompilerGenerated]
 3 public void set_Name(string value)
 4 {
 5     this.<Name>k__BackingField = value;
 6 }
 7 
 8 // 编译器生成的get访问器
 9 [CompilerGenerated]
10 public string get_Name()
11 {
12     return this.<Name>k__BackingField;
13 }
复制代码

  通过上面的代码可以看出,编译器为自动属性Name生成了名为“”的后备字段,并且生成了set_Name和get_Name两个访问器。

七、静态属性

  1.静态属性与声明方式

    可以在属性声明的类型前面加上static关键字声明静态属性。静态属性的特征如下:

      1).不能访问类的实例成员。

      2).不管类是否有实例,静态属性都是存在的。

      3).访问方式:从类的内部访问时,与访问其他类成员一样;从类的外部访问时,需要使用“类型名.成员名”的方式。

  2.示例

复制代码
 1     class Trivial
 2     {
 3         // 声明一个静态自动实现属性
 4         public static int MyVale { get; set; }
 5 
 6         // 声明一个实例方法
 7         public void PrintValue()
 8         {
 9             // 从类内部的实例方法访问静态属性:与访问其他成员一样。
10             Console.WriteLine("MyValue = {0}", MyVale);
11         }
12     }
13     class Program
14     {
15         static void Main(string[] args)
16         {
17             #region MyRegion
18             TimePeriod t = new TimePeriod();
19 
20             // 为属性赋值,隐式调用set访问器.
21             t.Hours = 24;
22 
23             // 读取属性值,隐式调用get访问器.
24             System.Console.WriteLine("Time in hours: " + t.Hours); 
25             #endregion
26 
27             // 从类的外部访问静态属性:使用"类名.属性名"的访问方式
28             Trivial.MyVale = 10;
29             Console.WriteLine(Trivial.MyVale);
30         }
31     }
复制代码

 

奔跑!狮子赶不上最慢的羚羊就会饿死;羚羊跑不过最快的狮子就会被吃掉!

C#基础教程09 封装 封装是面向对象编程中非常重要的一个概念。在C#中,我们可以使用访问修饰符和属性来实现封装。封装可以带来很多好处,包括隐藏实现细节、提供公共接口、减少耦合性和简化代码。在编写C#程序时,我们应该充分发挥封装的优势,提高代码的质量和效率。 阅读详情

相关推荐

告别实车测试:手把手教你用Vector VT平台搭建OBC/DCDC的HIL测试台架

本文详细介绍了如何利用Vector VT平台搭建新能源汽车OBC/DCDC的HIL测试台架,涵盖硬件选型、模型部署到自动化测试的全流程。通过HIL仿真测试技术,工程师可以高效验证动力域关键部件,大幅缩短开发周期并降低成本,特别适合新能源汽车三电系统的开发验证。

weixin_42659194的博客 338

【C#】 =>符号

=>读作 goes to,是C#3.0新增的内容 Lambda 委托 delegate int Method(int a, int b); Method m += (a ,b) => a + b; Console.WriteLine(m(2, 3)); linq 比较常用的就是作为linq表达式 internal abstract class GeoService { internal abstract void Update(GeoLocation locat

欢迎指错||纠正||建议||水评+点赞&&评论&&关注&&转发 1万+

计量经济学tempdisagg的python库:年度时序变月度

计量经济学tempdisagg的python库:年度时序变月度

素质云笔记 1526

C#学习——属性访问器

using System; using System.Collections.Generic; using System.Text; namespace _属性访问器 { class myClass { public string age1; private string age2;//将字段设为private,在其他类中无法访问,只能通过其属性访...

二胖的博客 451

大彩串口屏+LUA避坑指南:从Flash读写到控件状态配置的5个常见问题

本文针对大彩串口屏的LUA脚本开发,深度剖析了Flash数据存储与控件状态配置中的5个常见陷阱。重点讲解了如何通过标志位安全初始化Flash、正确处理多字节数据转换,以及如何精准配置按钮与文本控件的状态与事件响应,帮助开发者提升开发效率与代码可靠性。

weixin_27945229的博客 241

【Ensp】FTP服务器设置和FTP解析

大部分的多媒体多媒体应用协议,如SIP,FTP,NetMeeting协议等,使用约定的固定端口来初始化一个控制连接,再动态地选择端口用于数据传输,并且这些端口选择是不可预测的。在防火墙设置时,可以通过ASPF(应用层报文过滤)中的Server Map表来满足多通道协议的正常工作,它正常检测应用层报文信息,并动态地根据报文内容创建和删除临时的Server Map表项,以允许其它非约定端口通过防火墙。(5)我们可以在路由器或能访问ftp服务器的设备上,通过cli命令行的方式来访问ftp服务器。

进击的小小白 1862

C#里=>的两种用法

第一种用法,比较好理解,其实就是Lambda表达式的写法,在C# 3到C# 5版本间,=>只有此种用法。版权声明:本文为优快云博主「弹吉他的小刘鸭」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。MaxHealth1是一个Property,设置了getter,每次访问该值的时候,都会调用x?用于Lambda表达式里,此时的=>被称为lambda operator。可以看到,每次去取X1的值的时候,都会执行。这个表达式,所以上面的问题解决了。在C# 6的版本里,

qq_29794385的博客 2586

基于Python实现人脸识别相似度对比

随着人工智能技术的不断进步,人脸识别成为了一种广泛应用的技术。人脸相似度对比是其中的一个重要应用场景,可以用于人脸搜索、身份验证等方面。本文将介绍如何使用Python实现人脸相似度对比。

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 9808

C# =>实用详解

我们在使用C#编程的时候,经常会用到=>这个符号,但是大家理解过其中的具体用法吗? =>主要有两方面的作用,一个限制属性状态,另一个简化匿名委托和Lambda 用法一:定义只读属性 public class ManPeople { public string Sex => "男"; public string Name { get; set; }} public class WomanPeople { public string Sex => "女"; ......

IT技术猿猴的博客 2万+

【RT-DETR多模态融合改进】| 自研 多模态大核选择模块:MM_LSK,适配多模态图像信息融合

本文记录的利用改进的多模态大核选择模块(MM-LSK)优化RT-DETR,构建可见光-红外双模态目标检测网络。在遥感等大尺寸图像的可见光-红外双模态小目标检测任务中,单模态检测易受光照、云雾、背景干扰等因素影响,且小目标外观信息匮乏,无法仅基于单模态外观实现较好的识别,因此需要融合双模态互补特性与广泛的跨模态上下文信息进行辅助。

Limiiiing的博客 381

ADBMS1818芯片

 可测量多达18串电池电压 3 mV最大总测量误差 内置isoSPI接口 使用单根双绞线,长达100米 290 μs内可完成系统中所有单体电池电压测量。

m0_61973119的博客 4271

C#属性使用 =>

在c#中经常使用Lambda表达式,在Lambda表达式中=>是很常见的,但是最近在看代码时发现一个另类的写法,就是在属性中使用=>,写法如下: PropertyType PropertyName => expression; 举例: public class Location { private string locationName; public string Name => locationName; } 上面的写法,跟下面的写法,作用是一样的。

qq_38721111的博客 2885

基于Requests的百度图片搜索爬取技术详解

本文介绍了一种高效获取百度图片搜索数据的混合请求爬虫技术。该技术结合HTML解析与JSON API调用,通过分析百度图片搜索的网络通信模式,实现了首页HTML解析获取初始参数、后续页面直接调用JSON接口的双重机制。系统采用模块化设计,包含Cookies解析、智能请求分发、数据提取、图片下载等核心模块,支持自定义关键词和爬取页数配置。关键技术包括动态参数管理、正则表达式提取、JSON数据处理等,相比传统爬虫方法具有效率高、资源消耗低的优势,为计算机视觉研究提供了可靠的大规模图片数据采集方案。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 419

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

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

谁为拨动染血的时空苍穹 287

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

c#基础09(类与对象)

摘要 本文介绍了面向对象编程的基本概念及C#中的实现方式。主要内容包括: 面向对象核心特性:封装、继承、多态三大特性,强调C#中一切皆为对象。 封装机制:通过访问修饰符(public/private/protected等)控制成员可见性,实现数据隐藏和安全性。 类与对象: 类作为对象模板,包含字段、属性、方法等成员 对象是类的具体实例 详细说明字段与属性的区别及简写语法 构造方法:用于初始化对象并返回地址,支持无参和有参构造器。 代码示例:展示Person类的定义、对象创建、属性访问和方法调用等实际操作。

jxcklfn的博客 827

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C# WinForm —— 09 标签、文本框、按钮控件

一般显示不能编辑的文本或图像。

ChanMon的博客 1239

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

c#自动属性

例如下面 class myClass {         //一般属性用法         privae string name;         public string Name {                 get { return name;}                 set { name = value;}         }

Ungeiliviabler 1340

C#笔记09 数组

C#笔记09 数组 ——本系列是基于人民邮电出版社《C#2008 C#图解教程》、清华大学出版社《C#入门经典(第五版)》两本书的自学C#笔记,如果您发现了本文的纰漏,还望不吝指正。 写在前边 *复习:类型是一种模版,C#提供了15种预定义类型,还可以创建自己的用户定义类型,有6种类型: 类类型(class) 结构类型(struct) 数组类型(array) 枚举类型(enum) 委托类型(delegate) 接口类型(interface) 1. 什么是数组 数组实际上是由一个变量名称表示的一组同类型

Tervor_HAN的博客 518

C#基础09-面向对象关键字

/ 经典静态方法调用。base.方法名()

李宥的博客 1070

个人C#面试题系列-更新至2022/09

C#面试题系列,单独记录一下毕业后这两年所经历的一些关于C#的面试。就当梳理一下知识。

lilizys的博客 1万+

C# 属性(Property)

属性是 C# 中用于封装类或结构体字段的一种特殊成员。通过属性,我们可以控制字段的读写权限,以及设置和获取字段的值时的逻辑。属性提供了一种更加安全和灵活的字段访问方式,使得类的封装性更强。自动属性是 C# 3.0 引入的一种简化属性声明的语法,它允许我们以更简洁的方式声明属性。

lly202406的博客 674

2021-09-09 C# 基础 Part 1

.Net 基础 Part 1 .Net 是一个平台,是一种技术 c# 是一种编程语言 .Net 能做什么?——可以做桌面应用程序、Internet 应用程序、WP8、Uniy3D、虚拟现实 两种交互模式——C/S,客户机(Client)/服务器模式(Server),如qq,客服端需要安装专用的客户端软件,winform应用程序;B/S,浏览器(Browser)/服务器模式(Server),客户机上只需安装浏览器,Internet应用程序。 IDE,Integrated Development Enviro

Coraaaaaaaaa 176

C#——属性和方法

方法声明可以包含一组特性和private、public、protected、internal这4个访问修饰符的任何一个有效组合,还可以包含new、static、virtual、override、sealed、abstract、extern等修饰符。Main()方法是程序的一个入口点,程序将在此处创建对象和调用其他方法,一个C#程序中只能有一个入口点(只能有一个Main方法)方法的声明的返回值类型指定了由该方法计算和返回值的类型,如果该方法并不返回值,则其返回类型为void。

2401_86294292的博客 1170

1 C# 入门基础,C#简介之什么是C#

这里是引用:w3cshool的C#教程 :链接地址:C#教程 C# 简介 由 xqjrorz 创建,Carrie 最后一次修改 2015-09-13 C# 简介 C# 是一个现代的、通用的、面向对象的编程语言,它是由微软(Microsoft)开发的,由 Ecma 和 ISO 核准认可的。 C# 是由 Anders Hejlsberg 和他的团队在 .Net 框架开发期间开发的。 C# 是专为公共语...

忙碌的流氓兔 568

C# 类(二)——成员:字段、属性、方法、事件

字段是直接在类或结构体中声明的任何类型的变量。 类可以拥有实例字段或静态字段,或同时拥有两者。实例字段用来描述对象的状态,静态字段用来描述类的状态。也就是说,静态字段属于类本身,在类的所有对象中共享,从对象A所作的更改将立刻呈现在对象B和C上;而实例字段属于每个对象,修改A的实例字段,并不影响B和C。

sc_1313的博客 3779
上一篇: 用C#语言泛化单件模式
下一篇: Cocos2d-x2.0 粒子系统深入分析三部曲(二)
linuxheik
博客等级 码龄15年 865粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值