C# 字段、属性、成员变量

引言:

C#与java,C++中的这些基本概念略有不同。因为容易混淆,所以这里总结下区别。希望能对初学者有帮助!

一.定义与作用

1.字段(field):是C#类级别定义的,和方法同一级别。

  • 一般用来类内部进行访问,充当一种类中的"全局变量"角色;
  • 或者配合属性来使用

2.属性:同样是C#类级别定义的,一般是供外部类访问的。

3.成员变量:"全局变量",在类中定义的变量,区别于在方法中定义的局部变量。它与字段属性不是同一级别概念,字段,属性都可以叫做成员变量。

二.使用

class Basic

{

private string FieldVar;//这是字段,在当前类中调用

private string fieldVarForProperty;//这是字段,配合属性用

public string  FieldVarForProperty//这是属性

{

get{return fieldVarForProperty;}//属性中使用了字段

set{ fieldVarForProperty=value;}

}

}

这里可以看出:字段就是变量,而属性则类似于方法。属性能够使得外部类访问当前类的字段。这里存在一些问题:

1.有人说,那我们可以将字段定义为public,那外部不就可以访问了。

确实可以访问,但是违背了类的设计原则。面向对象要求对数据进行封装。如果这里我们将字段定义为public,来使外部访问,那么外部就会随意的破坏我们的字段。所以不这么做

2.有人说,属性为什么要配合字段使用呢

直接定义成下面这样不就可以了

public  string FieldProperty

{

get {return FieldProperty;}

set{FieldProperty=value;}

}

编译确实没有问题,能够通过。但是思考一下,当我们调用get/set方法时,在方法体内又使用了FieldProperty属性,是个死循环,程序会down掉的

注:C#是有自动实现的属性的,就是说

public string FieldProperty

{

get;set;

}

C#会自动为你声明一个私有字段的

三.字段与属性区别

1. 字段总是可读可写(readonly关键字除外)属性可读可写(至少要有一样)
2.字段总是立即执行,效率高。属性还需要调用方法,效率低
3.字段能作为ref,out参数,属性不可以
时间: 2024-10-27 13:58:56

C# 字段、属性、成员变量的相关文章

【Java】+反射1+获取属性/成员变量 的名称及类型

扩展链接:[Java]+反射2+设置属性/成员变量 的值 1.目标类 2.获取目标群类中的属性及属性的类型 3.代码 1 @Test 2 public void testA() { 3 Class clazz = ZGXRequest.class; 4 // step1 获取类中所有的属性 5 Field[] fields = clazz.getDeclaredFields(); 6 for (Field field : fields) { 7 // step2 获取每个属性的类型(以点分割 需

福利->KVC+Runtime获取类/对象的属性/成员变量/方法/协议并实现字典转模型

我们知道,KVC+Runtime可以做非常多的事情.有了这个,我们可以实现很多的效果. 这里来个福利,利用KVC+Runtime获取类/对象的所有成员变量.属性.方法及协议: 并利用它来实现字典转模型. 废话不多说,直接上代码: 1.工具类(其实就是NSObject的一个分类)头文件 1 #import <Foundation/Foundation.h> 2 3 @interface NSObject (YSRuntime) 4 5 /** 6 返回当前类的属性数组 7 8 @return 属

Category / Extention / 属性 / 成员变量 /

转载自:http://blog.csdn.net/itianyi/article/details/8618128 在ios第一版中,我们为输出口同时声明了属性和底层实例变量,那时,属性是oc语言的一个新的机制,并且要求你必须声明与之对应的实例变量,例如: @interface MyViewController :UIViewController { UIButton *myButton; } @property (nonatomic, retain) UIButton *myButton; @e

OC中成员属性 成员变量

比如用property声明一个变量属性 然后我们会为它用懒加载的方式重写get方法 然后我们在使用这个变量的时候,都是用self.itemArray,为什么这样用比较好呢,这是因为self.是对属性的访问,编译器在检测到用@property声明的属性时,会自动为属性生成setter和getter,如果自己重写setter或getter,则编译器会跳过自动生成,使用自定义的setter和getter,所以当用self.这种方式时(并在等号右边调用时),这时就会进入到我们自定义的懒加载方法.也就是说

对Objective-C相关的类、方法、属性、成员变量介绍

类的定义@interface FirstClass :NSObject@end//@interface表示声明的是一个类,“:”表示继承关系,@end类的结束类的实现@implementation FirstClass方法的声明+(void)print;-(id)init;//"+"表示声明的是一个类方法,由雷鸣调用//“-”表示声明的时实例方法,必须由类的对象来调用//不带参数的方法在调用时,会使用隐藏的self参数来访问实例变量的属性.声明带参数的方法:+(void)initWit

Objective-C——类、方法、属性、成员变量

有过相关编程语言基础,了解C++/java的相信对类的类.对象等概念是了解的.在此我也不做过多地赘述. 关于OC中类的定义及方法使用这块,OC定义了一套自己的规范 类的定义: @interface FirstClass :NSObject @end //@interface表示声明的是一个类,":"表示继承关系,@end类的结束 类的实现 @implementation FirstClass 方法的声明: +(void)print; -(id)init; //"+"

C#属性和变量的区别学习

参考一 昨天看三层架构 (具体没怎么弄懂) 发现一般有一页代码专门用户存放字段的 而且都用用属性封装..令我诧异的是 很多字段属性都存在 get{}和set{} 和普通的变量没什么区别(可读可写) 我就感觉属性就是给字段一个多的选择方式,有的字段是不允许更改的.. 博客园一查,还真的涨见识了 刚写程序时总觉得一个字段就能满足要求,何必要使用定义起来麻烦的属性要get.set的去定义,代码量还大,真不知道他们的区别和优点例: public class myclass { public static

数组 面向对象 成员变量和局部变量额区别

一.数组 1.数组中常见的错误: 1.NullPointerExcepation : 空指针异常 原因:引用的类型变量没有指向任何的对象,在这种情况下还访问了它的属性和方法. 一个对象如果使用完了不会立马释放,只是将这个对象变为一个垃圾对象,由垃圾回收机制自己来释放.,我们没办法操作它释放. 2.ArrayIndexOutOfBoundsExcepation :数组下表越界. 二.面向对象 1.java也属于面向对象编程 : 2.面向对象的三大特征 : 封装,继承,多态.类,对象. 3.对象 :

6_面向对象基础、成员变量和局部变量的区别

一.面向对象的思想 面向对象特点:(1)更符合我们思想习惯的思想:        (2)可以将复杂的事情简单化:        (3)将我们从执行者变成了指挥者,角色发生了转换. 二.类与对象及其应用 1.事物和类的对应关系   事物      类   属性  ----------成员变量   行为  ----------成员方法 2.成员变量和成员方法   成员变量:和以前定义变量一样,存储位置放生了改变,在类中方法外   成员方法:和以前定义方法一样,只不过去掉了static. 3.类与对象

java中局部变量和成员变量的区别?

在类中的位置不同 成员变量:成员位置---在类中,方法外定义的变量 局部变量:在方法定义中,或者方法声明上的变量 在内存中的位置也不同 成员变量:在堆内存中 局部变量:在栈内存中 生命周期不同 成员变量:随着对象的创建而存在,随着对象的回收而消失 局部变量:随着方法调用而存在,随着方法的调用完毕而消失 初始化不同 成员变量:跟对象相关的,描述一个对象的属性(成员变量存在一个系统 默认初始化),当然也可以直接赋值 局部变量: 在使用之前,必须初始化,否则编译不通过 原文地址:https://blo