1.string是c#中的c,String?net Framework的类(在c# IDE中不?x)显C? ;
2.c# string映射?net Framework的String ;
3.如果用string,~译器会(x)把它~译成StringQ所以如果直接用String可以让~译器少做一点点工作 ;
4.如果使用c#Q徏议用stringQ比较符合规?;
5.string始终代表 System.String(1.x) ?::System.String(2.0) ;
6.String只有在前面有using System;的时候ƈ且当前命名空间中没有名ؓ(f)String的类型(class、struct、delegate、enumQ的时候才代表System.String ;
7.string是关键字QString不是Q也是说string不能作ؓ(f)cR结构、枚举、字Dc(din)变量、方法、属性的名称Q而String可以 ;
1. 什么是局部类型?
C# 2.0 引入了局部类型的概念。局部类型允许我们将一个类、结构或接口分成几个部分Q分别实现在几个不同?cs文g中?br />
局部类型适用于以下情况:(x)
(1) cd特别大,不宜攑֜一个文件中实现?br />(2) 一个类型中的一部分代码动化工具生成的代码,不宜与我们自q写的代码混合在一赗?br />(3) 需要多人合作编写一个类?br />
局部类型是一个纯语言层的~译处理Q不影响M执行机制——事实上C#~译器在~译的时候仍?x)将各个部分的局部类型合q成一个完整的cR?/p>
public partial class Program
{
static void Main(string[] args)
{
}
}
partial class Program
{
public void Test()
{
}
}
[Attribute1, Attribute2("Hello")] [Attribute1, Attribute2("Hello"), Attribute3, Attribute2("Exit")] partial class Class2: Iinterface1, Iinterface2 {} class Class2: Iinterface1, Iinterface2, Iinterface3 {}
2. 局部类型的限制
(1) 局部类型只适用于类、接口、结构,不支持委托和枚D?br />(2) 同一个类型的各个部分必须都有修饰W?partial?br />(3) 使用局部类型时Q一个类型的各个部分必须位于相同的命名空间中?br />(4) 一个类型的各个部分必须被同时编译?br />
3. 局部类型的注意?/strong>
(1) 关键字partial是一个上下文关键字,只有?class、struct、interface 攑֜一h才有关键字的含义。因此partial的引入不?x)媄响现有代码中名称为partial的变量?br />(2) 局部类型的各个部分一般是分开攑֜几个不同?cs文g中,但C#~译器允许我们将他们攑֜同一文g中?br />
4. 局部类型的应用Ҏ(gu)?/strong>
在局部类型上的特性具?#8220;累加”效应?/p>
partial class Class1{}
[Attribute3, Attribute2("Exit")]
partial class Class1{}
相当?/p>
class Class1 {}
注:(x)Attribute2属性允许在cM多次使用?br />
5. 局部类型上的修饰符
(1) 一个类型的各个部分上的讉K修饰W必ȝ持一致性?br />(2) 如果一个类型有一个部分用了abstract修饰W,那么整个c都被视ؓ(f)抽象cR?br />(3) 如果一个类型有一个部分用了 sealed 修饰W,那么整个c都被视ؓ(f)密封cR?br />(4) 一个类的各个部分不能用相互矛盄修饰W,比如不能在一个部分上使用abstractQ又在另一个部分上使用sealed?br />
6. 局部类型的基类和接?/strong>
(1) 一个类型的各个部分上指定的基类必须一致。某个部分可以不指定基类Q但如果指定Q则必须相同?br />(2) 局部类型上的接口具?#8220;累加”效应?/p>
partial class Class2: Iinterface3 {}
partial class Class2: Iinterface2 {}
相当?/p>
http://blog.csdn.net/guolei0451/article/details/1301884
循环语句是编E的基本语句Q在C#中除了沿?/span>C语言的@环语句外Q还提供?/span>foreach语句来实现@环。那么我要说的就是,在@环操作中量使用foreach语句来实现?/span>Z来更好地说明Z么要提倡?/span>foreachQ用如下三种不同方式来编写@环语句?/span>
int[] nArray = new int[100];
// Use "foreach" to loop array
foreach( int i in nArray )
Debug.WriteLine( i.ToString() );
// Use "for" to loop array
for( int i = 0; i < nArray.Length; i++ )
Debug.WriteLine( nArray[i].ToString() );
// Another way using "for" to loop array
int nLength = nArray.Length;
for( int i = 0; i < nLength; i++ )
Debug.WriteLine( nArray[i].ToString() );
很明显,foreach语句很简z,但是它的优点不仅仅在于此Q它的效率也是最高的?/span>可能很多为最后一U的效率?x)更高,因?f)表面上看着不用每次讉K引用cd的属性。可是它却是三者当中,效率最低的。因?/span>C#是强cd查,那么对于数组讉K的时候,要对索引的有效D行判断,那么对于最后一U代码实际生的效果如同下面的代码一栗?/span>
// Another way using "for" to loop array
int nLength = nArray.Length;
for( int i = 0; i < nLength; i++ )
{
if( i < nArray.Length )
Debug.WriteLine( nArray[i].ToString() );
else
throw new IndexOutOfRangeException();
}
Q书中这里有些出入,l过|友sozdream的提C,?.1环境下发现最后一U方法是最快的Q前两者的速度基本相等Q通过Dissambly查看最后一U@环方法所产生的代码,q没有生类g文章所说的那种索引查。不q还是不使用最后一U,因ؓ(f)此方法对索引的判断有些脱节,其是当循环中数l尺寸发生变化的时候,索引有效查无法及(qing)时进行)
foreach语句除了z和高效外,q有很多优点Q接下来一一列D?/span>
W一个就是不用考虑数组起始索引是几Q很多h可能从其他语a转到C#的,那么原先语言的v始烦引可能不?/span>1Q例?/span>VB或?/span>Delphi语言Q那么在C#中用数l的时候就隑օ疑问到底使用0开始还是用1开始呢Q那么?/span>foreach可以避免这c问题?/span>
W二个好处就是对于多l数l操作用foreach非常简便了Q例如:(x)
int[,] nVisited = new int[8,8];
// Use "for" to loop two-dimension array
for( int i = 0; i < nVisited.GetLength(0); i++ )
for( int j = 0; j < nVisited.GetLength( 1 ); j++ )
Debug.WriteLine( nVisited[i,j].ToString() );
// Use "foreach" to loop two-dimension array
foreach( int i in nVisited )
Debug.WriteLine( i.ToString() );
对于三维或更多维Q?/span>foreach语句不用发生M变化Q而对?/span>for语句来说pq行修改了,q里׃多说了?/span>
W三个要说的是foreach完成cd转换操作Q这U体现可能通过如上的例子看不出M效果Q但是对?/span>ArrayList之类的数据集来说Q这U操作就昑־比较H出Q例如:(x)
// Init an arraylist object
int[] nArray = new int[100];
ArrayList arrInt = new ArrayList();
arrInt.AddRange( nArray );
// Use "foreach" to loop an arraylist
foreach( int i in arrInt )
Debug.WriteLine( i.ToString() );
// Use "for" to loop an arraylist
for( int i = 0; i < arrInt.Count; i++ )
{
int n = ( int ) arrInt[i];
Debug.WriteLine( n.ToString() );
}
最后要说的是?/span>foreachq没有增加资源用,q句话听得有些难懂,׃对于l承?/span>IEnumerable接口的类型数据,才能使用foreach语句Q那么对于?/span>foreach?x)访?/span>IEnumerable接口?/span>GetEnumeratorҎ(gu)来进行枚?/span>Q那么对于如上的foreach语句Q对应的语句其实如下Q?/span>
IEnumerator it = arrInt.GetEnumerator() as IEnumerator;
using( IDisposable disp = it as IDisposable )
{
while( it.MoveNext() )
{
int elem = ( int )it.Current;
Debug.WriteLine( elem.ToString() );
}
}
也就是说在出?/span>foreach之后对于IEnumerator的对象也q行Dispose处理?/span>
对于foreach说了q么多好处,那么在用它是否可以无懈可击呢。其实不是这L(fng)Q?strong>?/span>foreach语句中有两个限制Q第一不能修改枚D成员Q其ơ不要对集合q行删除操作?/span>也就是如下两U方式都是错误的?/span>
// Use "foreach" to loop an arraylist
foreach( int i in arrInt )
{
i++;//Can't be compiled
Debug.WriteLine( i.ToString() );
}
// Use "foreach" to loop an arraylist
foreach( int i in arrInt )
{
arrInt.Remove( i );//It will generate error in run-time
Debug.WriteLine( i.ToString() );
}
那么对于如上两个操作Q可以用for来实玎ͼ此外q里多说一句,是对于一个记录集的多条数据删除问题,也是l常出现问题的地方(论坛上经帔RcM的问题)Q由于在一些记录集中进行删除的时候,在删除操作之后相应的索引也发生了变化Q这时候的删除要反q来q行删除Q大致Ş式如下?/span>
// Use "for" to loop an arraylist
for( int i = arrInt.Count - 1; i >=0; i-- )
{
int n = ( int ) arrInt[i];
if( n == 5 )
arrInt.RemoveAt( i ); // Remove data here
Debug.WriteLine( n.ToString() );
}
除了q两个地方外Q?/span>foreach可以基本适用于Q何@环,因此对于循环的编写要量使用foreachQ因为它?x)你的代码清晰z,又不失高效?/span>
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1100236
http://www.cnblogs.com/jonescheng/archive/2008/05/09/1190049.html
const 的概念就是一个包含不能修改的值的变量?br />常数表达式是在编译时可被完全计算的表辑ּ。因此不能从一个变量中提取的值来初始化常量?br />如果 const int a = b+1;b是一个变量,昄不能再编译时p出l果Q所以常量是不可以用变量来初始化的?br />
readonly 允许把一个字D设|成帔RQ但可以执行一些运,可以定它的初始倹{?br />因ؓ(f) readonly 是在计算时执行的Q当然它可以用某些变量初始化?br />readonly 是实例成员,所以不同的实例可以有不同的帔R|qreadonly更灵zR?br />
readonly 关键字与 const 关键字不同?/font>
1. const 字段只能在该字段的声明中初始化?br /> readonly 字段可以在声明或构造函C初始化。因此,Ҏ(gu)所使用的构造函敎ͼreadonly 字段可能h不同的倹{?br />2. const 字段是编译时常数Q?readonly 字段可用于运行时常数?br />3. const 默认是静态的Q?readonly 如果讄成静态的必LC声明?br />4Q?font color="#0000ff">const 对于引用cd的常敎ͼ可能的值只能是 string ?null?br /> readonly可以是Q何类?br />
* 需要注意的一个问题是Q?/p>
对于一?readonly ?Reference cdQ只是被限定不能q行赋|写)操作而已。而对其成员的d仍然是不受限制的?
public static readonly Class1 my = new Class1();
…
my.SomeProperty = 10; //正常
my = new Class1(); //出错Q该对象是只ȝ
但是Q如果上例中?Class1 不是一?Class 而是一?structQ那么后面的两个语句都?x)出错?br />
static readonly:
Java ?static 是当载入一个类时执行一ơ的?br />
C#中是怎么执行的,我没有查到。很奇怪几乎每本java的书都会(x)说static的问题,C#的往往只说怎么用,但是应该是在main函数调用之前初始化,所?font color="#0000ff">static readonly也是q行时的Q可以用变量付|如:(x)
private static readonly string path = System.Windows.Forms.Application.StartupPath + “aaa”;
var只能用于局部变量的定义Q你不能把类的属性定义成 varQ也不能把方法的q回值类型或者是参数cd定义成var。dynamic没有这些局限了?/p>
dynamiccdq没有蟩q类型校验,只是延迟Cq行时。如果在q行Ӟ到cd不兼容,照样?x)抛出异常?/p>
你可能在以下情况下用dynamicQ?/p>
1.COM对象
2.动态语a(如IronPythonQIronRuby{?对象
3.反射对象
4.C# 4.0中动态创建的对象
public static class Global { }
]]>
|
作者:(x)烟花三月在扬?/a> |