惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

W
WeLiveSecurity
T
The Exploit Database - CXSecurity.com
C
CXSECURITY Database RSS Feed - CXSecurity.com
S
Security @ Cisco Blogs
T
Threat Research - Cisco Blogs
TaoSecurity Blog
TaoSecurity Blog
Recent Commits to openclaw:main
Recent Commits to openclaw:main
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
腾讯CDC
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
The Blog of Author Tim Ferriss
Microsoft Azure Blog
Microsoft Azure Blog
罗磊的独立博客
F
Full Disclosure
博客园 - 【当耐特】
C
CERT Recently Published Vulnerability Notes
Engineering at Meta
Engineering at Meta
Application and Cybersecurity Blog
Application and Cybersecurity Blog
T
Threatpost
I
Intezer
V2EX - 技术
V2EX - 技术
H
Hackread – Cybersecurity News, Data Breaches, AI and More
The Hacker News
The Hacker News
小众软件
小众软件
Google DeepMind News
Google DeepMind News
T
Tailwind CSS Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
B
Blog RSS Feed
Microsoft Security Blog
Microsoft Security Blog
N
News | PayPal Newsroom
MyScale Blog
MyScale Blog
AI
AI
Vercel News
Vercel News
Spread Privacy
Spread Privacy
美团技术团队
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
The GitHub Blog
The GitHub Blog
V
Vulnerabilities – Threatpost
Schneier on Security
Schneier on Security
Cyberwarzone
Cyberwarzone
G
GRAHAM CLULEY
Help Net Security
Help Net Security
Hacker News: Ask HN
Hacker News: Ask HN
Google DeepMind News
Google DeepMind News
MongoDB | Blog
MongoDB | Blog
L
LINUX DO - 热门话题
U
Unit 42
L
LangChain Blog
Recent Announcements
Recent Announcements

博客园 - 杨连国

win10 IoT开发 Serial​Device 返回 null .NET Delegates: A C# Bedtime Story【转载】 C++ 和 C# 变量定义的一点区别 变量定义 接口(CLR via C# 读书笔记) 生成器模式(builder) 基本类型、引用类型、值类型——(CLR via C#) 抽象工厂模式(abstract factory) 李建忠C#面向对象设计模式纵横谈 —— 单件模式 李建忠C#面向对象设计模式纵横谈 —— 面向对象设计模式与原则 程序设计和重构的目标 OO设计原则——读《你必须知道的.NET》 输入法灰掉bug解决 半角全角Bug解决 由迭代模式想到得——用设计模式理解 .NET ASCII 表设计之妙 调用VC封装的DLL时,两个类型匹配问题 调用非托管Dll Invoke 和 BeginInvoke 的区别
类型和成员基础(CLR via C#)
杨连国 · 2008-07-03 · via 博客园 - 杨连国

     类型的成员种类:没什么好说的
 
     类型的可见性:也没什么好说了,友元程序集可以在需要时了解一下

     成员的可见性

          需要知道 assembly <--> internal  family <--> protected 对应关系

          C#要求基类和子类对同一成员量的访问权限必须是一致的,例如在基类中是protected的成员变量,继承到子类后,依然是protected。而CLR却不是这么规定的,可以将protected变为public。

     静态类

          结构不能声明为静态的,因为CLR天生要求它必须实例化。

     部分类、结构、接口

          需要说明的是partial关键字是C#提供的,CLR并对此并不知晓。不错的属性!

     组件、多态和版本控制

          组件软件编程(Component Software Programming,CSP)

      如何调用虚方法

          在CLR内部调用方法有两个指令call 和 callvirt。
          call可以用来调用静态方法、实例方法和虚方法。调用静态方法是必须指明调用方
法的类型,调用实例方法或虚方法必须指明变量引用,call指令假定变量不为null。  callvirt指令用来调用实例方法和虚方法,JIT编译器在编译调用该指令时,会验证对应的变量是否为null,则抛出异常。  为什么C#编译器不只生成call指令呢?这是因为c#编译器团度觉得应该做null检查,尽管这样会牺牲一定的效率。  那是不是对虚方法的调用都会使用callvirt指令呢?有两种例外,第一种是子类覆写虚方法时调用基类的该方法,例如base.somemethod(),这是会使用call指令,因为使用callvirt会造成循环调用。第二种情况是对结构方法是用call指令,因为值类型天生就是不能为null的。

          另外需要注意,如果一个方法之前定义为非虚方法,而已经被广泛调用,就不应该再将其改为虚方法,因为之前的调用使用的是call指令,除非重新编译,否则会产生不可预期的结构。但是如果使用C#编程倒是不用担心这一点,因为C#编译器总是在调用实例方法时使用callvirt指令

     类型和成员可见性

          Jeffrey建议定义一个类时,缺省应该具有sealed关键字,并说出了几个原因,原因就不多说了,说的也对,如果仅仅是为了封装,而不需要继承,应该是sealed。但是C#缺省并无该关键字,也就是C#定义一个类,那么该类肯定可以继承,除非显示的添加了sealed关键字。但是在C#代码内,如果不加任何前缀修饰,默认是internal

     类型版本控制:说了一下new的问题,就不啰嗦了