- 浏览: 117747 次
- 来自: ...
文章分类
最新评论
1,不彻底的abstract
即使是abstract class,也不能对实现的接口的某个成员视而不见,即下面这样是不允许的:
interface in_one{
void A();
}
abstract class base_one : in_one{
}
这一点上还是Java方便,不管C#的初衷是什么
2,out参数与指针的指针
out子类不能转化为out基类,如果允许转换的化,将无法保证类型安全性;即out参数相当于指针的指针,而父类的指针与子类的指针是没有继承关系的,所以不能转化
3,强制针对接口编程
针对接口编程只是一个一般性的原则,但C#提供了一种机制,强迫客户程序员根据接口来引用你的实现类:显式接口成员
interface A{
void a();
}
class A_Sub:A {
void A.a() {
}
}
static void Main(string[] args)
{
((A)new A_Sub()).a(); //OK!
new A_Sub().a(); //Error!
}
显式接口成员实现程序跟其他成员相比,有不同的访问能力特性。因为显式接口成员不能通过实现类访问,所以,它们从感觉上是私有的。但是,由于它们可以通过接口引用访问,从感觉上它们又是公共的。
显式接口成员实现程序主要服务于两个目的:
a,类或结构实现一个客户不感兴趣的内部接口
b,用相同的签名消除接口成员的歧义
为了使显式接口成员实现程序有效,类或成员必须在它的基本类列表中命名一个接口,这个列表中包含一个成员,它的全部有效名称、类型和参数类型与显式接口成员实现程序的那些要完全一致
4,@ 取消转义
取消字符串转义尚可理解,不过连关键字都变成普通标识了,实在看不出有多大意义
5,struct的构造函数
自定义的ctor并不能隐藏默认的无参构造函数,稍有意外,却也在情理之中,默认无参构造函数对于struct有良好定义的语义
6,const,readonly
const相当于C++的static const
readonly相当于C++的const
所以,const相当于static readonly,当然,还是有些区别,const编译时获得值,static readonly运行时
public class Color {
public const Color Black = new Color(0, 0, 0);//error
public static readonly Color White = new Color(255, 255, 255);//ok
private Color(byte r, byte g, byte b) {
}
}
7,自然的boxing,unboxing
string s = "abc";
object o = s;
int i = 123;
object o = i;
对于string的例子都不会吃惊,为什么要特殊对待int的例子呢?string是System.String的别名,只要把int当作System.Int32的别名,一切不都很自然了吗?int确实是System.Int32的别名,int和string还是有区别的,boxing后的值会被复制,数组调用很明确的不会扩展到数值类型的数组
或许是效率的原因吧
8,智能的自定义转型
C++不允许一次转换中调用超过一次的自定义转型操作符,C#同样不允许,不同的是C#会在调用自定义转型操作符前后为源类型和目标类型各插入一次自动寻找的标准转型操作,如果需要的话;简单的说;
9,操作符重载
C++里内存由程序员管理,允许重载new操作符,C#则理所当然的禁止了对new的重载
C++里算术运算符+-*/等重载后,其结合形式+=,-=,*=,/=不会被自动重载,C#为了保证语义一致性,自动重载了它们的结合形式
C++里短路逻辑运算符&&,||重载后不再具有短路的特性,C#干脆禁止了对它们的重载,只能通过以下形式变通,居然保持了短路的语义:
class Test {
public static bool operator false(Test test){
return false;
}
public static bool operator true(Test test){
return false;
}
public static Test operator & (Test lhs, Test rhs){
return lhs;
}
public static Test operator | (Test lhs, Test rhs){
return lhs;
}
static void Main(string[] args)
{
if(new Test() && new Test()){
}
}
}
10,作用域
与Java有点不一样,嵌套块中名称相同的标识符都必须引用相同的实体,这项规则保证一个表达式上下文中名称的意义在一个块中是相同的:
class Test
{
double x;
void F(bool b) {
x = 1.0;
if (b) {
int x = 1;
}
}
}
是错误的,因为x在外部块中(在if语句中包含嵌套块的扩展)引用了不同的实体。相反,例子
class Test
{
double x;
void F(bool b) {
if (b) {
x = 1.0;
}else {
int x = 1;
}
}
}
是允许的,因为名称x在外部块中永远不会使用
11,离开finally
与Java一样,finally中抛出异常,原先的异常(假如有的话)将被终止;不一样的是,不允许使用return,goto等离开finally,不知为什么
12,子包与外围包
与Java不一样,子包居然能访问外围包,不用using,方便,但合理否?
13,属性权限
get/set好像不能设置不同的权限,比如,我想internal set,而public get,不知怎么弄
14,序列化
当绝大部分域可以使用默认序列化,少数需要特殊处理时,将那少数几个域做成internal独立对象,令其自定义序列化,然后原对象中包含这个独立对象
15,int[][]是一维数组
int[,]才是二维的,矩阵
int[][]实际是锯齿
int[][] one = new int[7][];
int[,] two = new int[3,2];
维指示符在最后的非数组元素前被从左到右读。例如类型int[][,,][,]是一个int类型的两维数组的三维数组的单维数组
数组调用很明确的不会扩展到数值类型的数组,例如,不存在可以允许把int[]看作object[]的转换
数组初始化程序必须有与数组维数一样的嵌套级别。最外层嵌套与最左边的维数对应,而最里层的嵌套与最右边的维数对应
16,new virtual有没有意义?
class A
{
public virtual void F() { Console.WriteLine("A.F"); }
}
class B: A
{
public override void F() { Console.WriteLine("B.F"); }
}
class C: B
{
new public virtual void F() { Console.WriteLine("C.F"); }
}
class D: C
{
public override void F() { Console.WriteLine("D.F"); }
}
class Test
{
static void Main() {
D d = new D();
A a = d;
B b = d;
C c = d;
a.F();
b.F();
c.F();
d.F();
}
}
类C和D包含两个有相同签名的虚拟方法:一个被A引入而一个被C引入。被C引入的方法隐藏了从A继承的方法。这样,D中的覆盖声明覆盖了被C引入的方法,而D覆盖被A引入的方法是不可能的。例子产生下面的输出:
B.F
B.F
D.F
D.F
什么情况下,什么理由,我们需要new virtual?
17,override时无法改变访问修饰
即使是放宽
18,x+=y 结果有可能是void
“在一个形式为x += y 或 x -= y的操作中,当x是一个事件成员而引用在x所在的类型外面发生时,操作的结果就是void;这个规则禁止外部代码直接检查事件成员” ???
19,构造函数执行顺序
可以把一个实例变量初始化函数和一个构造函数初始化函数,看作是自动插在构造函数主体中的第一条语句前。例子
class A
{
int x = 1, y = -1, count;
public A() {
count = 0;
}
public A(int n) {
count = n;
}
}
class B: A
{
double sqrt2 = Math.Sqrt(2.0);
ArrayList items = new ArrayList(100);
int max;
public B(): this(100) {
items.Add("default");
}
public B(int n): base(n – 1) {
max = n;
}
}
包含了许多变量初始化函数,并且也包含了每个形式(base和this)的构造函数初始化函数。这个例子与下面介绍的例子相关,在那里,每条
注释指明了一个自动插入的语句(自动插入构造函数调用所使用的语法不是有效的,至少用来演示这个机制)。
class A
{
int x, y, count;
public A() {
x = 1;// Variable initializer
y = -1;// Variable initializer
object();// Invoke object() constructor
count = 0;
}
public A(int n) {
x = 1;// Variable initializer
y = -1;// Variable initializer
object();// Invoke object() constructor
count = n;
}
}
class B: A
{
double sqrt2;
ArrayList items;
int max;
public B(): this(100) {
B(100);// Invoke B(int) constructor
items.Add("default");
}
public B(int n): base(n – 1) {
sqrt2 = Math.Sqrt(2.0);// Variable initializer
items = new ArrayList(100);// Variable initializer
A(n – 1);// Invoke A(int) constructor
max = n;
}
}
注意变量初始化函数被转换为赋值语句,并且那个赋值语句在对基类构造函数调用前执行。这个顺序确保了所有实例域在任何访问实例的语句
执行前,被它们的变量初始化函数初始化。例如:
class A
{
public A() {
PrintFields();
}
public virtual void PrintFields() {}
}
class B: A
{
int x = 1;
int y;
public B() {
y = -1;
}
public override void PrintFields() {
Console.WriteLine("x = {0}, y = {1}", x, y);
}
}
当new B() 被用来创建B的实例时,产生下面的输出:
x = 1, y = 0
因为变量初始化函数在基类构造函数被调用前执行,所以x的数值是1。可是,y的数值是0(int的默认数值),这是因为对y的赋值直到基类构造函数返回才被执行。
静态构造函数自动被调用,不能被显式调用。虽然提供了许多约束条件,但是静态构造函数执行的确切时间和顺序是不确定的:
一个类的静态构造函数在这个类的任何实例被创建前执行。
一个类的静态构造函数在类的任何静态成员被引用前执行。
一个类的静态构造函数在它的所有派生类的静态构造函数执行之后执行。
一个类的静态构造函数从不会被执行一次以上。
20,struct可以实现接口
稍有意外,看来struct基本类似于“对基本数据类型域有深拷贝语义的sealed类”,说完这句话都觉得别扭
21,接口
与Java不一样,接口不能声明静态常量和内部类,接口的成员必须是方法、属性、事件或索引
22,枚举
不明白为什么非得跟整型扯上点关系,为了&|操作?即使这样,也可以内部用整型来实现,不必暴露出来
23,Delegate
观察者模式在语言层面的支持,优于java.util.Observable,Delegate是类型安全的,不同于java.util.Observable,Delegate不是异常安全的
24,条件属性
通过对被调用方进行标记,代替传统的调用方条件编译,使代码整洁,单点开关,又消除了宏的缺点
(The Java Programming Language Notes)
发表评论
-
The Object Primer
2004-12-11 11:21 5841,书名 被翻译成“ ... -
错误处理规范
2004-12-11 16:47 755错误处理规范 〇、概念澄清 概念 解释 错误 ... -
Java,误解为何如此之深
2005-08-24 13:50 592前几天被电话面试,问J ... -
Java:画蛇添足的编码规范
2005-09-02 13:13 606前几天公司培训编码规范: 第n条: ... -
synchronized : 规则, 推论与实践
2007-07-23 22:32 46314.3.Synchronization. Rule ... -
交互设计: 股市帮凶
2008-05-04 21:30 642同事 Y 在线操作股票时, 把"买入"点成 ... -
交互设计: 火车上的厕所
2008-05-26 17:17 606有人在动车组的厕所前等了很久, 直到乘务员路过说厕所是被锁住了 ... -
设计原则与模式: 案例介绍--CppUnit
2008-06-01 20:15 610设计原则与模式: 案例介绍--CppUnit CppUnit ... -
工作流:形参,实参,相关数据
2004-12-11 11:40 670关于形参,实参,相关数据 一、形参(FormalParame ... -
工作流:第一次发版,过程总结
2004-12-11 11:42 708交流 即时讨论:小组成员咫尺之遥,有问题立即提出并解决 ... -
工作流:第一次发版,设计总结
2004-12-11 11:43 610整体 面向接口:消息系统,持久系统等,其实现都是可替换 ... -
Beyond Workflow : An Introduction to Vitria BusinessWare
2005-09-26 10:13 802一、简介 Busines ... -
Vitria BusinessWare: 存储与访问安全
2006-03-26 15:45 745事实上,BusinessWare使用LDAP做为存储机制和 ... -
Vitria BusinessWare: 平台与软件总线
2006-04-01 12:59 837经过一段时间的使用 ... -
Vitria BusinessWare: Web Services
2006-04-01 14:30 739BusinessWare的Web Services ... -
Web Services:自洽,编码,交换模型
2006-04-01 16:02 6721, 自洽 以前曾经写过: 目前WebServi ... -
Web Services:WSDL 1.1 规范中的几个错误
2006-04-01 16:40 718读完了WSDL 1.1的规范,令人惊讶的是发现似乎例子中有几个 ... -
C++/CLI:被忽视的集成技术
2006-05-17 20:02 753十几行代码,就使一个重要的旧系统组件,完全融入了基于.Ne ... -
AJP/JK:异构Web平台的集成技术
2006-05-25 21:44 706Tomcat Connector 可以将Tomcat ... -
Vitria BusinessWare: 事件与端口
2006-05-27 17:24 655Event BusinessWare是一个事件驱动的系统 ...
相关推荐
4. **LINQ(Language Integrated Query)**:C# 3.0引入的查询表达式,使得在C#中处理数据更加直观,支持数据库、XML、集合等多种数据源的查询。 5. **动态编程**:C# 4.0引入了dynamic关键字,允许在运行时绑定...
《C#编程语言》(CHM) 是一本针对C#初学者的基础教程,它全面地介绍了C#这门强大的编程语言。C#是由微软公司开发的一种面向对象的、现代的编程语言,主要用于构建Windows应用程序、Web应用以及移动应用等。CHM格式的...
根据提供的文件信息,我们可以从《C#编程语言》这本书中提炼出以下关键知识点: ### 一、关于本书 - **作者信息**: - **Anders Hejlsberg**:微软杰出工程师,C#之父,也是Delphi、Turbo Pascal的原始开发者之一...
C# 之父 Anders Hejlsberg的力作,C# 程序员的圣经。
在第三版中,引入了许多新的特性,如 LINQ(Language Integrated Query,语言集成查询)、匿名方法、Lambda表达式、扩展方法等,这些都是提高代码效率和可读性的关键工具。 1. LINQ:LINQ允许程序员使用一致的查询...
本书是经典C#语言书Programming C#的最新版第4版。著名作者Jesse Liberty为有经验的Ⅱ从业人员快速掌握并运用这种新型语言提供了所需要的信息。本书从c#的关键字和基本概念开始介绍,并告诉你如何结合三个核心的应用...
5. **LINQ(Language Integrated Query)**:C#引入了集成查询语言,使得数据库查询和其他数据源的操作更加简洁和高效。 6. **异步编程**:C#的async/await关键字简化了异步编程,使开发者能够轻松处理并发和IO密集...
In just 21 days readers will learn how to use the key features of the C# programming language—not only the commands, but how to create entire programs using them within a few simple chapters....
Programming Visual C# 2005 The Language Programming Visual C# 2005 The Language Programming Visual C# 2005 The Language
5. 查询表达式(LINQ):Language Integrated Query,是C# 3.0的一个重要特性,允许在代码中直接编写SQL风格的查询,支持对象、数据库、XML等数据源的查询操作。 6. 遗产和接口:C# 3.0继续强化了面向对象的特性,...
C# Programming Cookbook 英文epub 本资源转载自网络,如有侵权,请联系上传者或csdn删除 本资源转载自网络,如有侵权,请联系上传者或csdn删除
A complete technical specification of the C# programming language, the third edition differs in several ways from the first two. Most notably, of course, it has been updated to cover all the new ...
Designed to give you enough familiarity in a programming language to be immediately productive, Learning C# Programming with Unity 3D provides the basics of programming and brings you quickly up to ...
《C# Programming From Problem Analysis to Program Design》第四版是一本深入浅出的C#编程教程,旨在引导读者从问题分析到程序设计的全过程。这本书专为初学者和有一定经验的程序员设计,通过全面覆盖C#语言的核心...