// VS 2015

定义一个Book类:

namespace ConsoleTest
{
public class Book
{
private string _bookIsbn;
private string _bookName;
private string _press;
private string _author;
private short _edition; public string BookIsbn { get { return _bookIsbn; } set { _bookIsbn = value; } } public string BookName {get { return _bookName;} set { _bookName = value; } } public string Press { get { return _press;} set { _press = value; } } public string Author { get {return _author;} set { _author = value; } } public short Edition { get {return _edition;} set { _edition = value; } }
}
}

类似于java的getter和setter方法, C#使用了属性来进行字段的封装。

C#允许在属性内的操作:

  • 还可以在get和set内进行各种操作,比如判断输入是否合法等。
  • 可以声明某一个get或者set的访问性比属性的访问性更严格,不能全部都比属性严格(C#2)
  • 可以实现自动属性。(C#3)

修改如下:

namespace ConsoleTest
{
public class Book
{
private string _bookIsbn; public string BookIsbn { get { return _bookIsbn; } private set { _bookIsbn = value; } } public string BookName { get; private set; } public string Press { get; set; } public string Author { get; set; } public short Edition { get; set; }
}
}

在这个版本代码中,省略了字段保留了属性,并且BookName,Press,Author,Edition均实现了自动属性。C#编译器会自动的将其扩展为和之前的代码一样。

如果查看一下IL代码:(部分)

.class public auto ansi beforefieldinit
ConsoleTest.Book
extends [mscorlib]System.Object
{ .field private string _bookIsbn .field private string '<BookName>k__BackingField'
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor()
= ( )
.custom instance void [mscorlib]System.Diagnostics.DebuggerBrowsableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggerBrowsableState)
= ( ) // ........
// int32(0) // 0x00000000 .field private string '<Press>k__BackingField'
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor()
= ( )
.custom instance void [mscorlib]System.Diagnostics.DebuggerBrowsableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggerBrowsableState)
= ( ) // ........
// int32(0) // 0x00000000 .field private string '<Author>k__BackingField'
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor()
= ( )
.custom instance void [mscorlib]System.Diagnostics.DebuggerBrowsableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggerBrowsableState)
= ( ) // ........
// int32(0) // 0x00000000 .field private int16 '<Edition>k__BackingField'
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor()
= ( )
.custom instance void [mscorlib]System.Diagnostics.DebuggerBrowsableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggerBrowsableState)
= ( ) // ........
// int32(0) // 0x00000000 .method public hidebysig specialname instance string
get_BookIsbn() cil managed
{
.maxstack
.locals init (
[] string V_0
) // [7 38 - 7 39]
IL_0000: nop // [7 40 - 7 57]
IL_0001: ldarg. // this
IL_0002: ldfld string ConsoleTest.Book::_bookIsbn
IL_0007: stloc. // V_0
IL_0008: br.s IL_000a // [7 58 - 7 59]
IL_000a: ldloc. // V_0
IL_000b: ret } // end of method Book::get_BookIsbn .method private hidebysig specialname instance void
set_BookIsbn(
string 'value'
) cil managed
{
.maxstack // [7 72 - 7 73]
IL_0000: nop // [7 74 - 7 92]
IL_0001: ldarg. // this
IL_0002: ldarg. // 'value'
IL_0003: stfld string ConsoleTest.Book::_bookIsbn // [7 93 - 7 94]
IL_0008: ret } // end of method Book::set_BookIsbn

可以看到,BookName和Press等属性扩展出了字段,而BookISBN属性被写成了两种方法:

public hidebysig specialname instance string
get_BookIsbn()
以及 private hidebysig specialname instance void
    set_BookIsbn(
string 'value'
)
public string BookIsbn {  private get { return _bookIsbn; } private set { _bookIsbn = value; } }

如果将BookIsbn改为如上形式,编译器会报错,因为get和set都比属性具有更严格访问性。此时的属性其实无用,因为无法从外部进行任何的访问。

public string BookIsbn {  protected get { return _bookIsbn; } private set { _bookIsbn = value; } }

同样,如上的形式也会报错。

如果不对get或者set的访问性进行指定,那么会和属性的访问性一样。但C#禁止对get和set显示声明与属性一样的访问性。下列形式都会报错:

public string Press {  public get; set; }
public string Press { get; public set; }
public string Press { public get; public set; }

C#基础--属性的更多相关文章

  1. Unity UGUI——Rect Transform组件(基础属性)

    基础属性:Width.Height.Pivot图示 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvTXJfQUhhbw==/font/5a6L5L2T/fo ...

  2. Android绘图机制(一)——自定义View的基础属性和方法

    Android绘图机制(一)--自定义View的基础属性和方法 自定义View看起来,确实看起来高深莫测,很多Android开发都不是特别在行这一块,这里面的逻辑以及一些绘画都是有一点难的,说一下我目 ...

  3. Silverlight实例教程 - Validation数据验证基础属性和事件(转载)

    Silverlight 4 Validation验证实例系列 Silverlight实例教程 - Validation数据验证开篇 Silverlight实例教程 - Validation数据验证基础 ...

  4. HTML&CSS基础-属性选择器

    HTML&CSS基础-属性选择器 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.html源代码 <!DOCTYPE html> <html> & ...

  5. webpack2.x基础属性讲解(一)

      webpack作为构建工具平时作为前端作为优化.模块编程.和分片打包的重要组成部分,大家可能并不陌生,如果没有时刻的去关注文档,那么大家可能不太清楚webpack已经默默然的升级到2.x了,对比1 ...

  6. JS基础属性跟运算

    小编这周学了JS函数基础知识跟运算!!下面就迫不及待跟大家分享一下 [switch case的结构写法] 结构写法:(略) 2注意事项: ①switch结构()中的表达式.可以使用各种js支持的数据类 ...

  7. webpack2.x基础属性讲解

    webpack作为构建工具平时作为前端作为优化.模块编程.和分片打包的重要组成部分,大家可能并不陌生,如果没有时刻的去关注文档,那么大家可能不太清楚webpack已经默默然的升级到2.x了,对比1.x ...

  8. 2.C#面向对象基础属性

    属性: 1.一般属性开头字母大写,字段开头字母小写. 2.通过public来赋值的方法无法判断赋值是否非法! 3.无论赋值如何,取值如果就是不采用赋值的结果,那么无论赋值什么都不管用. 4.经典错误之 ...

  9. JSP基础——属性保存范围和request对象

    JSP属性保存范围 JSP中提供了四种属性保存范围,分别为page,request,session及application. 1.page范围,指设置的属性只在当前页面有效.通过pageContext ...

  10. css_01之基础属性、选择器

    1.  常用属性:①color:文本颜色:②background-color:背景颜色:③font-size:文字大小: 2.  样式声明:①内部样式:style=“样式规则:”,写于作用标签内,优先 ...

随机推荐

  1. 生活沉思录 via 哲理小故事(四)

    1.围墙里的墓碑 第一次世界大战期间,驻守意大利某小镇的年轻军官结识了镇上的牧师.虽然军官信仰信教,而牧师是天主教牧师,但两人一见如故. 军官在一次执行任务中身负重伤,弥留之际嘱托牧师无论如何要把自己 ...

  2. c语言,递归翻转一个单链表,c实现单链表

    目的:主要是练习c里面单链表的实现,递归思想复习; #include <stdlib.h> #include <stdio.h> typedef struct _Node{// ...

  3. AOP的成员介绍

    AOP(Aspect Oriented Programming)面向切面编程,AOP的作用不过多介绍,本文是主要是介绍AOP的成员,是我在复习的时候记录的一些笔记,方便以后查阅方便一些. JointP ...

  4. 启动mysql错误解决方案,学会查看错误日志:mysql.sock丢失,mysqld_safe启动报错

    本人还是个菜鸟,下面是我的经验之谈,能解决一些问题,有不对的地方,敬请斧正. 我的是CentOS6.3+MySQL5.1.57. 重启了一次服务器后,使用> mysql -u root -p登陆 ...

  5. .NET中 类型,对象,线程栈,托管堆在运行时的关系

    .NET中 类型,对象,线程栈,托管堆在运行时的关系 The Relationship at Run Time between Types,Objects,A Thread's Stack,and T ...

  6. 微信移动端web页面调试小技巧

    技术贴还是分享出来更加好,希望能对一些朋友有帮助,个人博客  http://lizhug.com/mymajor/微信移动端web页面调试小技巧

  7. Javascript单元测试框架比较Qunit VS Jasmine

    Javascript单元测试框架比较Qunit VS Jasmine 工欲行其事必先利其器,好的单元测试框架是TDD成功的一半.Javascript优秀的测试框架很多, 包括Jasmine,Qunit ...

  8. ACE 容器之三 ACE_Unbounded_Queue的使用

    以下代码演示了如何在ACE_Unbounded_Queue这个队列容器中存储具体的数据元素和数据元素的指针. // ACEqueue.cpp : Defines the entry point for ...

  9. C# 根据路线点集合动态分段

    /// <summary>         /// 将数据根据起.止点分段,返回结果点集合         /// </summary>         public Obse ...

  10. oracle存储过程异常捕获

    在oracle中捕获异常,通过 //sql执行 exception when others then dbms_output.putline('exception'); 其中others表示捕获未命名 ...