// 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. SugarSync的API总结

    SugarSync API App支持SugarSync网盘的前提: 1.AccessKeyID:xxx 2.Private Access Key:xxx 3.AppID:xxx 详细的API总结如下 ...

  2. VIJOS1107 求树的最长链

    vijos1107环游大同80天 学习了一下求树的最长链的方法 最简单的思路就是两次dfs 两次dfs分别有什么用呢? 第一次dfs,求出某个任意的点能到达的最远的点 第二次dfs,从所搜到的最远的点 ...

  3. Web Builder

    Web Builder http://www.doc88.com/p-1748774598960.html 初次接触Infopath,我就被它的强大的功能,灵活的表单制作方式,全面对Web Servi ...

  4. GNU 项目(开源社区的由来,背后的哲学)

    转自译言网:http://article.yeeyan.org/view/88497/59257/ 第一个软件共享社区 当我在1971年开始在麻省理工人工智能实验室工作时, 我成为一个已经存在多年的软 ...

  5. C/C++ 中 const 修饰符用法总结

    C/C++ 中 const 修饰符用法总结 在这篇文章中,我总结了一些C/C++语言中的 const 修饰符的常见用法,供大家参考. const 的用法,也是技术性面试中常见的基础问题,希望能够帮大家 ...

  6. JS错误:Uncaught SyntaxError: Unexpected token ILLEGAL

    $('tbody', '#' + tableId).append('<tr onmouseover="this.style.backgroundColor=\'#eeeeee\'&qu ...

  7. c:forEach 实现换行

    Map<String,String> map = new TreeMap<String,String>(); map.put("key1", "v ...

  8. SlidingMenu源代码导入及错误分析和解决方法

    1.首先下载actionbarsherlock和SlidingMenu源代码 由于在SlidingMenu项目中,styles.xml文件使用到了actionbarsherlock里面的主题定义,所以 ...

  9. longlistselector 闪烁问题研究

    在使用微博的时候,发现微博列表偶尔闪一下.后来自己在写应用的时候也出现了这个问题,不过微博用的是listbox,而我用的是longlistselector.仔细关注了一下,发现闪烁的内容是最后一个it ...

  10. ASP.NET Web API的消息处理管道: HttpRoutingDispatcher

    ASP.NET Web API的消息处理管道: HttpRoutingDispatcher 认情况下,作为消息处理管道“龙头”的HttpServer的Dispatcher属性返回一个HttpRouti ...