2 用 static 修饰符声明属于类型本身而不是属于特定对象的静态成员。static 修饰符可用于字段、方法、属性、运算符、事件和构造函数,但不能用于索引器、析构函数或类型。备注 常数或者类型声明隐式地是静态成员。 不能通过实例引用静态成员。然而,可以通过类型名称引用它。例如,请考虑以下类: public class MyBaseC { public struct MyStruct { public static int x = 100; } } 若要引用静态成员 x,请使用完全限定名(除非可从相同范围访问): MyBaseC.MyStruct.x 尽管类的实例包含该类所有实例字段的单独副本,但每个静态字段只有一个副本。 不可以使用 this 引用静态方法或属性访问器。 注意 static 关键字在使用上比在 C++ 中有更多限制。若要与 C++ 关键字进行比较,请参见 C++ Language Reference 中的 static。 为了说明实例成员,请看一个表示公司雇员的类。假设该类包含一种对雇员计数的方法和一个存储雇员数的字段。该方法和字段都不属于任何实例雇员,而是属于公司类。因此,应该将它们声明为此类的静态成员。
realljx大哥 这个我知道啊,就是因为它讲得太含糊,我才上来问的啊
3.1 using 指令有两个用途: 创建命名空间的别名(using 别名)。 允许在命名空间中使用类型,例如,不必限定该命名空间中的类型使用(using 指令)。 using [alias = ]class_or_namespace; 其中: alias(可选) 希望表示命名空间的用户定义符号。之后,您就可以使用 alias 表示命名空间名。 class_or_namespace 希望使用或为其提供别名的命名空间名,或希望为其提供别名的类名。 备注 创建 using 别名以便更易于将标识符限定到命名空间或类。 创建 using 指令,以便在命名空间中使用类型而不必指定命名空间。using 指令不为您提供对可能嵌套在指定命名空间中的任何命名空间的访问。 命名空间分为两类:用户定义的命名空间和系统定义的命名空间。用户定义的命名空间是在代码中定义的命名空间。有关系统定义的命名空间的列表,请参见 .NET Framework 文档。 有关其他程序集中的引用方法的示例,请参见创建和使用 C# DLL。 示例 下面的示例显示了如何为命名空间定义和使用 using 别名: // cs_using_directive.cs using MyAlias = MyCompany.Proj.Nested; // define an alias to represent a namespacenamespace MyCompany.Proj { public class MyClass { public static void DoNothing() { } } namespace Nested // a nested namespace { public class ClassInNestedNameSpace { public static void SayHello() { System.Console.WriteLine("Hello"); } } }}public class UnNestedClass { public static void Main() { MyAlias.ClassInNestedNameSpace.SayHello(); // using alias } } 输出 Hello 示例 下面的示例显示了如何为类定义 using 指令和 using 别名: // cs_using_directive2.cs using System; // using directive using AliasToMyClass = NameSpace1.MyClass; // using alias for a classnamespace NameSpace1 { public class MyClass { public override string ToString() { return "You are in NameSpace1.MyClass"; } } }namespace NameSpace2 { class MyClass { } }namespace NameSpace3 { using NameSpace1; // using directive using NameSpace2; // using directive class Test { public static void Main() { AliasToMyClass somevar = new AliasToMyClass(); Console.WriteLine(somevar); } } } 输出 You are in NameSpace1.MyClass3.2 using 语句定义一个范围,在此范围的末尾将处理对象。 using (expression | type identifier = initializer) statement 其中: expression 希望在退出 using 语句时调用 Dispose 的表达式。 type identifier 的类型。 identifier type 类型的名称或标识符。定义一个以上 type 类型的 identifier 是可以的。在每一个 identifier = initializer 的前边都有一个逗号。 initializer 创建对象的表达式。 statement 嵌入的语句或要执行的语句。 备注 在 using 语句中创建一个实例,确保退出 using 语句时在对象上调用 Dispose。当到达 using 语句的末尾,或者如果在语句结束之前引发异常并且控制离开语句块,都可以退出 using 语句。 实例化的对象必须实现 System.IDisposable 接口。 示例 // cs_using_statement.cs // compile with /reference:System.Drawing.dll using System.Drawing; class a { public static void Main() { using (Font MyFont = new Font("Arial", 10.0f), MyFont2 = new Font("Arial", 10.0f)) { // use MyFont and MyFont2 } // compiler will call Dispose on MyFont and MyFont2 Font MyFont3 = new Font("Arial", 10.0f); using (MyFont3) { // use MyFont3 } // compiler will call Dispose on MyFont3 } }
sealed的作用,除了不希望别人继承之外,可能还有一些特别的地方。 比如String就是一个非常特别的东西,.NetFramework会特别对待他。他是sealed的。 如果允许从String继承,CLR在处理String的问题上,就非常麻烦了。static的好处就是不需要实例化,就可以调用。这就获得了传统“函数”级别的方便性。 另外static构造函数还将在该类型的静态成员首次被访问时触发,这也是一种很好的初始化机制。using(IDispable d = new <Class>){ } 这个语句块中,自动调用d的Dispose方法。确保资源释放。
C# 关键字 | 修饰符
密封类不能被继承。将密封类用作基类是错误的。在类声明中使用 sealed 修饰符可防止继承此类。不允许将 abstract 修饰符用于密封类。结构是隐式密封的;因此它们不能被继承。示例
// cs_sealed_keyword.cs
// Sealed classes
using System;
sealed class MyClass
{
public int x;
public int y;
}class MainClass
{
public static void Main()
{
MyClass mC = new MyClass();
mC.x = 110;
mC.y = 150;
Console.WriteLine("x = {0}, y = {1}", mC.x, mC.y);
}
}
输出
x = 110, y = 150
在前面的示例中,如果试图通过使用下面的语句从密封类继承:class MyDerivedC: MyClass {} // Error
将收到错误信息:'MyDerivedC' cannot inherit from sealed class 'MyBaseC'.
2.优势是永远只有一个实例,也不用声明实例,不用实例化,所以稍快点,只合适于单用户环境,多用户环境下比较难于控制冲突,但如果只是存放一些不用改的东西的话,也无所谓了
3.using 后面加空间名,用处
比如我不加上using System.Text;的话,那么我声明一个StringBuilder就要这样
System.Text.StringBuilder sb=new System.Text.StringBuilder("");
加了的话只要这样
StringBuilder sb=new StringBuilder("");
想节约输入什么,你又要用到这个的话你就声明这个吧
这些我都是查了MSDN才发上来的啊
比如那个sealed,它就说是避免被继承,那么,为什么要避免继承呢?总得有个理由吧?我想,这些东西应该是需要有一定的实际经验才能了解的。
小弟现在还是学生,没有什么经验,但是希望能够了解一些更加深入的东西,所以才上来问问你们这些实际经验丰富的大牛们啊,^_^
希望不吝赐教,^_^
用 static 修饰符声明属于类型本身而不是属于特定对象的静态成员。static 修饰符可用于字段、方法、属性、运算符、事件和构造函数,但不能用于索引器、析构函数或类型。备注
常数或者类型声明隐式地是静态成员。
不能通过实例引用静态成员。然而,可以通过类型名称引用它。例如,请考虑以下类:
public class MyBaseC
{
public struct MyStruct {
public static int x = 100;
}
}
若要引用静态成员 x,请使用完全限定名(除非可从相同范围访问): MyBaseC.MyStruct.x
尽管类的实例包含该类所有实例字段的单独副本,但每个静态字段只有一个副本。
不可以使用 this 引用静态方法或属性访问器。
注意 static 关键字在使用上比在 C++ 中有更多限制。若要与 C++ 关键字进行比较,请参见 C++ Language Reference 中的 static。
为了说明实例成员,请看一个表示公司雇员的类。假设该类包含一种对雇员计数的方法和一个存储雇员数的字段。该方法和字段都不属于任何实例雇员,而是属于公司类。因此,应该将它们声明为此类的静态成员。
这个我知道啊,就是因为它讲得太含糊,我才上来问的啊
创建命名空间的别名(using 别名)。
允许在命名空间中使用类型,例如,不必限定该命名空间中的类型使用(using 指令)。
using [alias = ]class_or_namespace;
其中:
alias(可选)
希望表示命名空间的用户定义符号。之后,您就可以使用 alias 表示命名空间名。
class_or_namespace
希望使用或为其提供别名的命名空间名,或希望为其提供别名的类名。
备注
创建 using 别名以便更易于将标识符限定到命名空间或类。
创建 using 指令,以便在命名空间中使用类型而不必指定命名空间。using 指令不为您提供对可能嵌套在指定命名空间中的任何命名空间的访问。
命名空间分为两类:用户定义的命名空间和系统定义的命名空间。用户定义的命名空间是在代码中定义的命名空间。有关系统定义的命名空间的列表,请参见 .NET Framework 文档。
有关其他程序集中的引用方法的示例,请参见创建和使用 C# DLL。
示例
下面的示例显示了如何为命名空间定义和使用 using 别名:
// cs_using_directive.cs
using MyAlias = MyCompany.Proj.Nested; // define an alias to represent a namespacenamespace MyCompany.Proj
{
public class MyClass
{
public static void DoNothing()
{
}
} namespace Nested // a nested namespace
{
public class ClassInNestedNameSpace
{
public static void SayHello()
{
System.Console.WriteLine("Hello");
}
}
}}public class UnNestedClass
{
public static void Main()
{
MyAlias.ClassInNestedNameSpace.SayHello(); // using alias
}
}
输出
Hello
示例
下面的示例显示了如何为类定义 using 指令和 using 别名:
// cs_using_directive2.cs
using System; // using directive
using AliasToMyClass = NameSpace1.MyClass; // using alias for a classnamespace NameSpace1
{
public class MyClass
{
public override string ToString()
{
return "You are in NameSpace1.MyClass";
}
}
}namespace NameSpace2
{
class MyClass
{
}
}namespace NameSpace3
{
using NameSpace1; // using directive
using NameSpace2; // using directive class Test
{
public static void Main()
{
AliasToMyClass somevar = new AliasToMyClass();
Console.WriteLine(somevar);
}
}
}
输出
You are in NameSpace1.MyClass3.2
using 语句定义一个范围,在此范围的末尾将处理对象。
using (expression | type identifier = initializer) statement
其中:
expression
希望在退出 using 语句时调用 Dispose 的表达式。
type
identifier 的类型。
identifier
type 类型的名称或标识符。定义一个以上 type 类型的 identifier 是可以的。在每一个 identifier = initializer 的前边都有一个逗号。
initializer
创建对象的表达式。
statement
嵌入的语句或要执行的语句。
备注
在 using 语句中创建一个实例,确保退出 using 语句时在对象上调用 Dispose。当到达 using 语句的末尾,或者如果在语句结束之前引发异常并且控制离开语句块,都可以退出 using 语句。
实例化的对象必须实现 System.IDisposable 接口。
示例
// cs_using_statement.cs
// compile with /reference:System.Drawing.dll
using System.Drawing;
class a
{
public static void Main()
{
using (Font MyFont = new Font("Arial", 10.0f), MyFont2 = new Font("Arial", 10.0f))
{
// use MyFont and MyFont2
} // compiler will call Dispose on MyFont and MyFont2 Font MyFont3 = new Font("Arial", 10.0f);
using (MyFont3)
{
// use MyFont3
} // compiler will call Dispose on MyFont3 }
}
能把1和3再说得详细点吗?
但是,MSDN上面的东西我都看过了啊
特别是第一个和第二个问题,MSDN上面太含糊了
CSDN上面的BLOG很多也是不怎么清楚的
不过,还是非常感谢您的热心
^_^
比如一些初始化的命令,写在静态的构造函数中,可以预防多次被执行。
比如String就是一个非常特别的东西,.NetFramework会特别对待他。他是sealed的。
如果允许从String继承,CLR在处理String的问题上,就非常麻烦了。static的好处就是不需要实例化,就可以调用。这就获得了传统“函数”级别的方便性。
另外static构造函数还将在该类型的静态成员首次被访问时触发,这也是一种很好的初始化机制。using(IDispable d = new <Class>){
}
这个语句块中,自动调用d的Dispose方法。确保资源释放。
sealed防止其他的类来继承的,
它主要有两个作用,一个是这个类并没有经过认真周密的考虑,继承了可能会有问题所以不允许别人继承或者自己以后再修改
另外一个就是没有问题但是基于其他原因不允许继承static 修饰符是数据存储属于类型而非对象实例,倒不是说它的运行效率高using可以提高异常的处理效率 至于详细的原因可以看看CLR的运行机制
最好是 .net技术内幕
不过,我倒是很喜欢用来建立sqlconnection之类的东西,原因就是它能够自动的调用对象的Dispose方法。