字段(Field)与属性(Property)

合集下载

C#方法,属性,字段

C#方法,属性,字段

C#⽅法,属性,字段以前是学C++的,初次学微软的C#头都⼤了。

什么字段,常量,属性,⽅法......微软把别⼈的东西拿来糅合在C#⾥,弄成了⼀个“⼤杂烩”。

其实,说到底,“字段”不就是“变量”吗,所谓的“⽅法”不就是“函数”吗,故弄⽞虚!从MSDN上弄来了详细的介绍,看下⾯::字段字段:“字段”是直接在或中声明的任何类型的变量。

字段是其包含类型的“成员”。

类或结构可以拥有实例字段或静态字段,或同时拥有两者。

实例字段特定于类型的实例。

如果您拥有类 T 和实例字段 F,可以创建类型 T 的两个对象,并修改每个对象中 F 的值,这不影响另⼀对象中的该值。

相⽐之下,静态字段属于类本⾝,在该类的所有实例中共享。

从实例 A 所做的更改将⽴刻呈现在实例 B 和 C 上(如果它们访问该字段)。

通常应仅为具有私有或受保护可访问性的变量使⽤字段。

您的类向客户端代码公开的数据应通过、和提供。

通过使⽤这些构造间接访问内部字段,可以针对⽆效的输⼊值提供防护。

存储由公共属性公开的数据的私有字段称为“后备存储”或“⽀持字段”。

字段通常存储这样的数据:该数据必须可供多个类⽅法访问,并且其存储期必须长于任何单个⽅法的⽣存期。

例如,表⽰⽇历⽇期的类可能有三个整数字段:⼀个表⽰⽉份,⼀个表⽰⽇期,还有⼀个表⽰年份。

不在单个⽅法范围外部使⽤的变量应在⽅法体⾃⾝范围内声明为局部变量。

在类块中通过指定字段的访问级别,然后指定字段的类型,再指定字段的名称来声明这些字段。

例如:1 public class CalendarEntry2 {3 // private field4 private DateTime date;56 // public field (Generally not recommended.)7 public string day;89 // Public property exposes date field safely.10 public DateTime Date11 {12 get13 {14 return date;15 }16 set17 {18 // Set some reasonable boundaries for likely birth dates.19 if (value.Year > 1900 && value.Year <= DateTime.Today.Year)20 {21 date = value;22 }23 else24 throw new ArgumentOutOfRangeException();25 }2627 }2829 // Public method also exposes date field safely.30 // Example call: birthday.SetDate("1975, 6, 30");31 public void SetDate(string dateString)32 {33 DateTime dt = Convert.ToDateTime(dateString);3435 // Set some reasonable boundaries for likely birth dates.36 if (dt.Year > 1900 && dt.Year <= DateTime.Today.Year)37 {38 date = dt;39 }40 else41 throw new ArgumentOutOfRangeException();42 }4344 public TimeSpan GetTimeSpan(string dateString)45 {46 DateTime dt = Convert.ToDateTime(dateString);4748 if (dt != null && dt.Ticks < date.Ticks)49 {50 return date - dt;51 }52 else53 throw new ArgumentOutOfRangeException();5455 }56 }若要访问对象中的字段,请在对象名称后⾯添加⼀个句点,然后添加该字段的名称,⽐如 objectname.fieldname。

C#属性(Property)和字段(Field)的区别

C#属性(Property)和字段(Field)的区别

C#属性(Property)和字段(Field)的区别导读:近期学习过程中发现了⼀些问题,我的学习只是学习,敲代码就是敲代码,没有加⼊思考,也不问为什么就直接去敲⼈家写好的例⼦去敲,把知识都学死了,逐渐散失了思考能⼒,所以学习的兴趣⼤打折扣,正如那句话—学⽽不思则罔,思⽽不学则殆,在设计模式中偶然看到了属性和字段,想想之前的C#中也提到过,但是从来没有思索过为什么有属性和字段?下⾯就来详细说明。

【字段】字段(Field)是⼀种表⽰与对象或类关联的变量的成员,字段声明⽤于引⼊⼀个或多个给定类型的字段。

字段是类内部⽤的,private类型的变量(字段),通常字段写法都是加个"_"符号,然后声明只读属性,字段⽤来储存数据。

【属性】属性(Property)是另⼀种类型的类成员,定义属性的⽬的是在于便于⼀些私有字段的访问。

类提供给外部调⽤时⽤的可以设置或读取⼀个值,属性则是对字段的封装,将字段和访问⾃⼰字段的⽅法组合在⼀起,提供灵活的机制来读取、编写或计算私有字段的值。

属性有⾃⼰的名称,并且包含get 访问器和set 访问器。

声明格式:属性修饰符类型属性名{get{//get访问器代码}set{//set访问器代码}}属性分类:根据get访问器和set访问器是否存在,属性可按下列规则分类。

那么问题来了,既然已经有字段⽤来存储数据,为什么还要引⼊属性来对数据进⾏访问,把声明的字段直接定义成公有的不就可以了吗?解答:在C#中,我们可以⾮常⾃由的、毫⽆限制的访问公有字段,但在⼀些场合中,我们可能希望限制只能给字段赋于某个范围的值、或是要求字段只能读或只能写,或是在改变字段时能改变对象的其他⼀些状态,这些单靠字段是⽆法做到的,于是就有了属性,属性中包含两个块:set和get,set块负责属性的写⼊⼯作,get块负责属性的读取⼯作。

在两个块中都可以做⼀些其他操作,如在set中验证赋的值是否符合要求并决定是否进⾏赋值。

C#字段(field),属性(property)

C#字段(field),属性(property)

C#字段(field),属性(property)C#字段和属性: 类成员包括变量和⽅法。

如果希望其他类能够访问成员变量的值,就必须定义为公有的,⽽将变量设为公有public,那这个成员变量就可以被任意访问(包括修改和删除),这样不利于数据安全。

C#通过属性读取和写⼊字段(成员变量),⽽不直接读取和写⼊,以此来提供对类中字段的保护。

属性可以⽤于类内部封装字段,属性是C#⾯向对象技术中封装性的体现。

属性和字段的区别: 属性是逻辑字段,是字段的扩展,并不占⽤实际的内存;⽽字段占⽤内存空间。

属性可以被其他类访问,⽽⾮public的字段不能被直接访问。

属性可以对接受的数据在范围上做限定;⽽字段不能。

使⽤属性的情况: 要求字段只能读或者写。

要求限制字段的取值范围。

在改变⼀个字段的值的时候希望改变对象的其他⼀些状态。

使⽤字段的情况: 允许⾃由读写。

取值范围只受数据类型约束⽽⽆其他任何特定限制。

值的变动不需要引发其他成员的相应变化。

using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace ConsoleApplication1{class Person{private string _name;private string _identificationID;private string _phoneNumber;public string Name { get; set; } //可读,可写public string IdentificationID { get; private set; } //只读public string PhoneNumber{get{return _phoneNumber;}set{if (value.Length != 11){Console.WriteLine("⼿机号码应该为11位!");}else{_phoneNumber = value;}}}}class Program{static void Main(string[] args){Person cherry = new Person(); = "Cherry";cherry.PhoneNumber = "12345678910";cherry.IdentificationID = "320000000000000000"; //报错,由于定义的是只读属性}}}。

记java实体类属性名为全部为大写踩的坑(基础)

记java实体类属性名为全部为大写踩的坑(基础)

记java实体类属性名为全部为⼤写踩的坑(基础)1.今天后台使⽤实体类接收参数,然后有个参数发现明明前后都是对应的,但是那个属性偏偏的不到数据后⾯百度才知道(写前端太久java基础都给忘了,该补补了)spring默认的命名⽅式为,⾸字母转⼩写,连续⼤写字母都转成了⼩写恍然⼤悟:也就是说当我实体类⾃动为SN时,get⽅法getSN也就相当于get,sn这个字段,set⽅法getSN也就相当于set,sn这个字段,就会导致跟字段SN不对应,导致⽆法注⼊值这时候其实有解决的办法,就是get,set⽅法添加@JsonPropety("属性名")解决Java的规范是⾸字母⼩写的然后驼峰命名看源码后发现public static String decapitalize(String s){if(s == null || s.length() == 0)//空处理return s;if(s.length() > 1 && Character.isUpperCase(s.charAt(1)) && Character.isUpperCase(s.charAt(0))){//长度⼤于1,并且前两个字符⼤写时,返回原字符串return s;} else{//其他情况下,把原字符串的⾸个字符⼩写处理后返回char ac[] = s.toCharArray();ac[0] = Character.toLowerCase(ac[0]);return new String(ac);}}得出结论当实体类的属性为前两个为⼤写时他会返回原字符AA->AAAa->aaaa->aa这样的差异会导致set,get取不到对应的值,所以还是严格按照java的命名规范来JavaBean 中的属性是通过 get/set ⽅法名得来的,因此getSname 对应的属性名是 snamegetSName 对应的属性名是 SName如果写成 sName 或者 Sname 的话就是不合法的属性名。

C#中字段与属性性能比较

C#中字段与属性性能比较

【摘要】【目的】比较字段与属性读取的性能【结论】使用字段比属性赋值,快50-60倍左右,读取,快3倍左右。

但是它不可能成为影响性能的主要瓶颈Effective C# 原则1:尽可能的使用属性(property),而不是数据成员(field)。

把所有的字段都设为私有字段,如果要暴露它们,则把它们封装成属性。

这也是微软推荐的方式。

具体的好处此处不赘述。

属性的实质是方法(get和set方法),IL中没有属性的概念。

因此,使用属性必然会带来性能的降低。

到底使用属性和使用字段的性能差多少。

我自己写了一个小程序进行测试。

主要代码如下:public class TestFeildProperty{static readonly int _RunTime = 10000000;public static void UseField(){DateTime begin = DateTime.Now;int milliSecondBegin = lisecond;for (int i = 0; i < _RunTime; i++){_TestField = 1;}DateTime end = DateTime.Now;TimeSpan result = end - begin;Console.WriteLine(result.ToString());}public static void UseProperty(){DateTime begin = DateTime.Now;int milliSecondBegin = lisecond;for (int i = 0; i < _RunTime; i++){TestField = 1;}DateTime end = DateTime.Now;TimeSpan result = end - begin;Console.WriteLine(result.ToString());}static int _TestField;static int TestField{set { _TestField = value; }get { return _TestField; }}}测试方式为对字段和属性循环赋值和读取(以上代码只有赋值部分)。

field字段

field字段

field字段field字段是在计算机科学和信息技术领域中常用的术语。

它用于描述数据结构中的一个单元或属性,用于存储特定类型的数据。

在数据库管理系统和编程语言中,field字段是一个命名的数据项,用于存储特定类型的值。

在关系型数据库中,每个表都由多个字段组成,用于存储表中的不同类型的数据。

每个字段都有一个名称和一个数据类型,例如整数、字符串、日期等。

这些字段可以用于定义表的结构和规范,以及实现数据的有效组织和管理。

例如,一个用户表可能包含字段如:姓名、年龄、性别等。

在编程语言中,field字段通常是指一个类或结构体中的变量或属性。

它可以用来描述对象的不同特征或状态。

例如,一个汽车类可以有颜色、品牌、型号等字段,用于存储不同汽车对象的属性。

通过访问和修改这些字段,可以操作和处理对象的数据。

field字段在数据分析和机器学习领域也非常常见。

在数据集中,每一列通常对应一个字段,表示一个特定的特征。

例如,在一个客户数据集中,字段可以包括年龄、性别、收入等,用于描述不同客户的特征。

通过对这些字段进行分析和挖掘,可以从数据中获取有价值的信息和洞察。

此外,field字段还有其他的应用和扩展。

例如,在网络协议中,field 字段用于描述和传输数据包的不同部分。

在表单和页面设计中,field 字段用于表示用户输入的表单元素和数据。

在电子邮件和文件格式中,field字段用于指定和解析不同的数据段。

总结来说,field字段是用于存储和描述数据的一种标准化方式。

它在不同的领域和应用中都起着重要的作用,用于定义和组织数据的结构和属性。

通过使用field字段,可以更好地管理和操作数据,并从中获得有价值的信息。

C#如何反射获取类中const常量(Static属性字段),并且获取值和设置值

C#如何反射获取类中const常量(Static属性字段),并且获取值和设置值
public static void updatePalmKey(string key = "test") {
BindingFlags flag = BindingFlags.Static | BindingFlags.NonPublic; FieldInfo f_key = typeof(ClsPublic).GetField("key", flag); f_key.SetValue(new ClsPublic(), key); }
/// <summary> /// 获取key /// </summary> /// <returns></returns> public static string getPalmKey() {
BindingFlags flag gFlags.NonPublic; FieldInfo f_key = typeof(ClsPublic).GetField("key", flag); object o = f_key.GetValue(new ClsPublic()); return o.ToString(); }
flag用于表示static和nonpublic私有类型private的静态staic的字段field或属性propertyconst被隐式的认为是静态属性
C#如何反射获取类中 const常量( Static属性字段),并且获取 值和设置值
//动态链接库中ClsPublic类有一变量 private static string key="1111"; //下面通过反射的技术修改和获取值 //设置key
flag 用于表示 Static 和 NonPublic 私有类型(Private)的 静态(Staic)的 字段(Field) 或 属性(Property) ,Const 被隐式的认为是 静态属性。

变量、字段、域、属性、属性过程

变量、字段、域、属性、属性过程

C#中的变量、字段、域、属性、属性过程在C#中:域:表示与对象或类相关联的变量,修饰符不论是不是public。

(与字段类似)字段:表示与对象或类相关联的变量。

通常来讲修饰符是public的成员变量称为字段,而private更适合说是局部变量。

(与域类似)属性:表示域或字段的自然扩展,使得在保证封装性的基础上实现了访问私有成员的便捷性。

域域表示与对象或类相关联的变量,声明格式如下:attributes field-modifiers type variable-declarators;域的修饰符field-modifiers可以是:new、public、protected、internal、private、static、readonly。

实际上,域相当于C++中的简单成员变量。

在下面的代码中,类A包含了三个域:公有的X和Y,以及私有的z。

class A{public int x;public string y;private float z;}字段字段是与对象或类相关联的变量。

当一个字段声明中含有static修饰符时,由该声明引入的字段为静态字段(static field)。

它只标识了一个存储位置。

不管创建了多少个类实例,静态字段都只会有一个副本。

当一个字段声明中不含有static修饰符时,由该声明引入的字段为实例字段(instance field)。

类的每个实例都包含了该类的所有实例字段的一个单独副本。

在下面的示例中,Color类的每个实例都有r,g,b实例字段的不同副本,但是Black,White,Red,Green和Blue等静态字段只有一个副本:public class Color{public static readonly Color Black = new Color(0, 0, 0);public static readonly Color White = new Color(255, 255, 255);public static readonly Color Red = new Color(255, 0, 0);public static readonly Color Green = new Color(0, 255, 0);public static readonly Color Blue = new Color(0, 0, 255);private byte r, g, b;public Color(byte r, byte g, byte b) {this.r = r;this.g = g;this.b = b;}}如示例所示,通过readonly修饰符声明只读字段。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C#: 字段(Field)与属性(Property)
基本概念
字段与属性的关系
属性访问器的使用
附:实例
(本文中的代码均在VS2005中运行过。

启动VS2005,新建一个C#语言的控制台应用
程序项目,将本文中代码复盖原自动生成的代码,启动调试,就可以看到运行结果)一)基本概念
看下面一段代码:
……
User zs =new User();
= "张三";
Console.WriteLine("姓名: " + );
……
可能有人推断,Name一定是User类的一个成员变量。

----对于C#而言,这个推断十有八九是错的。

C#的类成员在C++基础上有了扩展,“字段”与“属性”就是扩展后的两种类成员。

C#类中的“字段”,与C++类中的“变量”及JAVA中的“域”是同一概念。

对私有字段的读写,只能通过类内的方法。

C#专门提供了一个对私有字段进行读写的特殊“方法”。

这种"方法"不需要参数,但有含get{}或set{}的代码块。

这种特殊的“方法”,在C#中称为“属性”。

例如:
public class User
{
private string m_name; //m_name为字段
public string Name //Name为属性,它含有代码块
{
get
{
return m_name;//读取(返回m_name值)
}
set
{
m_name = value;//为m_name赋值
}
}
User类中的m_name为“字段”,而Name则为“属性”,属性代码块中get 与set,称为属性访问器。

私有的字段m_name可以通过公开的属性Name对它进行读写操作。

通过“属性”读取“字段”值时,将触发get访问器;通过“属性”为“字段”赋值,将触发set访问器。

如:
User zs =new User();
= "张三";//此句将自动触发set访问器,将"张三"赋予m_name
Console.WriteLine("zs的姓名是: " + );//此句将自动触发get 访问器,显示m_name的值。

注意这里的, 会使有些人误以为zs有一个存储着zs姓名的成员变量Name,但实际上存放zs的姓名的成员变量是m_name(在C#称之为“字段”),只是它已被彻底隐藏起来了。

二)字段与属性的关系
一个“属性”总是与某个“字段”相关联,两者有扯不断的关系。

这种关系可分2种:
1)通过属性访问器读(或写)的值就是字段的值
如上例,属性Name的访问器读写的值就是字段m_name的值。

2)通过属性访问器读(或写)的值是对字段进行某种运算后得出的值。

两者可能是同一类型,也可能不是。

如下例int类型的Age属性的值,就是对D ateTime 类型的字段m_birthday进行计算后得出的:
……
private DateTime m_birthday;
public int Age
{
get
{
return DateTime.Now.Year - m_birthday.Year;
}
}
……
三)访问器
在属性中的只实现get访问器的,称只读属性;只实现set访问器的,称只写属性;两者都实现的,称读写属性。

(参见后面的示例)。

通过访问器,我们可以根据访问者的身份对其操作权限进行限定,并对数据的合法性进行检查。

四)附例
using System;
namespace Field_Property
{
class User
{
private string m_name;
private DateTime m_birthday;
public User(string name)
{
this.m_name = name;
}
public string Name //读写属性
{
get { return m_name; }
set {m_name = value ; }
}
public DateTime Birthday //只写属性
{
set
{
if(value< Convert.ToDateTime("1900-1-1") || value.Year > DateTime.Now.Year - 3) Console.WriteLine("年龄有误!");
else
m_birthday = value;
}
}
public int Age //只读属性
{
get
{
return DateTime.Now.Year - m_birthday.Year;
}
}
}
class Program
{
static void Main()
{
User zs = new User("张三");
zs.Birthday = Convert.ToDateTime("1980-1-1");
Console.WriteLine("姓名: "+ );
Console.WriteLine("年龄: "+ zs.Age);
Console.ReadKey();
}
}
}
注:DateTime是结构。

在VS2005代码编辑界面右击“DateTime”,在弹出的菜单中选“转到定义”,可以看到它的定义。

相关文档
最新文档