1.在C++中允许从一个case贯穿到另一个case标签
比如:
int a =1; switch(a) { case 1: some statements; case 2; other statements; break; }
从常规的需求来看,大部分情况下,推荐使用as转换.
但要注意as不能用于value type.因为在转换不成功的时候返回null,而value type不能为
null.这时可以考虑用is.
object o = 1; int i = 0; if(o is int) i = (int)o;
因为委托还引发了sun和MS的论战.
Anders早在Borland的时候就在Delphi中引入了delegate,后来跑到MS,弄J#的时候又添加进了delegate,Sun很不满意,说他们破坏了Java语言的特性.
到了C#,Anders终于可以名正言顺地添加delegate了.
-------------------------------
狗尾续貂(二)
1.internal protected取的是internal和protected的并集,即在同一个Assembly或者不同
的Assembly内但是继承自该类都可以访问.
3..NET FrameWork采用了字符串缓冲池技术.
比如 string a = "test";和string b = "test";a和b指向内存中的同一块区域.
另外C#中有几种判等方式,是否重写可参照如下规则:
public static bool ReferenceEquals( object left, object right ); public static bool Equals ( object left, object right ); public virtual bool Equals( object right); public static bool operator==( MyClass left, MyClass right );
1.前两个无论如何不要override
2.第三个和第四个在自定义类型是ValueType的时候要改写
3.当自定义类型是ReferenceType的时候,如果想改变RefrenceType默认的用对象标志判等的方式,可以改写第三个
4.当自定义类型是RefrenceType的时候,最好不要改写operator==.
下面分别给出上述规则的原因:
1.
A.ReferenceEquals()这个方法当且仅当两个变量指向同一对象的时候才相等,它的实现是比较对象标志(Object Identity,任何对象在创建的时候都会生成一个OI),所以任何值类型用ReferenceEquals()比较所得到的结果都是false,即使跟自己比较也是,因为要装箱,装箱的结果肯定不是同一个对象.所以这个方法也就没有改写的必要.object的ReferenceEquals()是实现这种比较最好的方式.
B.Equals (object left, object right )这个方法用于在不知道待比较的参数是何种类型的时候.那如何比较两个变量是否相等那?很简单,把比较相等的职责交给其中一个待比较变量的Equals方法,上述方法的实现大概如下所述:
public static bool Equals( object left, object right ) { // Check object identity if (left == right ) return true; // both null references handled above if ((left == null) || (right == null)) return false; return left.Equals (right); }
2.为什么是值的时候要重写第三个方法?
ValueType是所有值类型的基类,由于要实现值相等的语意,它重写了object的Equals方法,但是在不知道派生类变量和其类型的情况下,ValueType的Equals在实现的时候只能用反射来比较,这样的效率是很低的,所以任何自定义的值类型都要重写Equals,以避免用ValueType的默认实现带来的反射的效率损失.
3.object的实例Equals方法的默认实现跟ReferenceEqual一样,是通过比较对象标志来实现的,有些ReferenceType需要值相等的语意,比如string,这是就要改写实例Equals.
4..Net FrameWork期望所有的ReferenceType的operator==保留引用语意.
相等在语意上必须满足三点
1.自反 a=a必须永远成立;
2.对称 a=b则b=a;
3.传递 a=b;b=c则a=c
public class Foo { public override bool Equals( object right ) { //1.判断待比较变量引用是否为空 if (right == null) return false; //2.是否指向同一实例,如果是同一实例则必然相等. if (object.ReferenceEquals( this, right )) return true;//3. 判断类型是否相同 if (this.GetType() != right.GetType()) return false;
// 4.比较内容 return CompareFooMembers( this, right as Foo ); } }
答案是不行,必须是类型相同的.举例如下:
public class B { public override bool Equals( object right ) { // check null: if (right == null) return false;// Check reference equality: if (object.ReferenceEquals( this, right )) return true;
// Problems here, discussed below. B rightAsB = right as B; if (rightAsB == null) return false;
return CompareBMembers( this, rightAsB ); } }
public class D : B { // etc. public override bool Equals( object right ) { // check null: if (right == null) return false;
if (object.ReferenceEquals( this, right )) return true;
// Problems here. D rightAsD = right as D; if (rightAsD == null) return false;
if (base.Equals( rightAsD ) == false) return false;
return CompareDMembers( this, rightAsD ); }
}
//Test: B baseObject = new B(); D derivedObject = new D();
// Comparison 1. if (baseObject.Equals(derivedObject)) Console.WriteLine( "Equals" ); else Console.WriteLine( "Not Equal" );
// Comparison 2. if (derivedObject.Equals(baseObject)) Console.WriteLine( "Equals" ); else Console.WriteLine( "Not Equal" );
if (base.Equals( rightAsD ) == false) return false;
4.跟C++的引用不一样,ref和out其实就是指针,在函数之间传递用的是拷贝传值.
本文向大家介绍C#语法相比其它语言比较独特的地方(二),包括了C#语法相比其它语言比较独特的地方(二)的使用技巧和注意事项,需要的朋友参考一下 之前有个兄弟给我的卷一re了帖子,我当时没有g,m,直到他把它删掉才后悔莫及,人生最痛苦的事情莫过于此。。。。。。 好,即便如此,我们还是满怀希望的向前奔去。接着写卷二。 还要提一下,上次最后说到的delegate,在我了解了它的实现和用途以及看到我的偶像
本文向大家介绍C#语法相比其它语言比较独特的地方(一),包括了C#语法相比其它语言比较独特的地方(一)的使用技巧和注意事项,需要的朋友参考一下 由于c#是由设计.net本身的人设计出来的,所以c#才是.net上最一流的语言。 实际上,已经有一百多万行c#代码用于实现.Net class framework。 要发挥出.net平台全部的效能,只有c#才是首选。 1,switch语句可以用来测试str
本文向大家介绍Objective-C语言日期比较,包括了Objective-C语言日期比较的使用技巧和注意事项,需要的朋友参考一下 示例 NSDate在Objective-C中有4种比较s的方法: - (BOOL)isEqualToDate:(NSDate *)anotherDate - (NSDate *)earlierDate:(NSDate *)anotherDate - (NSDate *
本文向大家介绍易语言输入字比较方法,包括了易语言输入字比较方法的使用技巧和注意事项,需要的朋友参考一下 易语言输入字比较,这个函数比较有意思,我们可以比较汉字和拼音,具体请往下看。 1、易语言新建一个windows窗口 点击进入代码编辑区 具体看如何用易语言编写自己第一个程序? 2、我们输入函数 输入字比较() 3、展开这个函数 我们发现这个函数有4个参数,其中一个默认为真 4、第一个参数我们输入
本文向大家介绍C语言字符串大小比较,包括了C语言字符串大小比较的使用技巧和注意事项,需要的朋友参考一下 C语言字符串大小比较 以上所述就是本文的全部内容了,希望大家能够喜欢。
本文向大家介绍在C语言中比较两个字符串是否相等的方法,包括了在C语言中比较两个字符串是否相等的方法的使用技巧和注意事项,需要的朋友参考一下 C语言strcmp()函数:比较字符串(区分大小写) 头文件:#include <string.h> strcmp() 用来比较字符串(区分大小写),其原型为: 【参数】s1, s2 为需要比较的两个字符串。 字符串大小的比较是以ASCII 码表上的顺序来决定