在c#中,如果没有提供构造函数,编译器会在后台创建一个默认的构造函数。这是一个非常基本的构造函数,它只能把所有的成员字段初始化为标准的默认值(如引用类型为空引用,数字类型为0,boo为false)。
但注意,如果提供了带参数的构造函数,编译器便不会自动提供默认的构造函数,只有在没有定义任何构造函数的时候,编译器才会自动提供默认的构造函数。
由上上一篇我们知道,在初始化一个派生类时,会调用派生类的构造函数,并且会先调用父类的构造函数,在默认情况下是父类的默认构造函数。也就说,当派生类没有显示的调用父类的有参构造函数(当父类提供了自己的构造函数时),父类必须提供一个Parameterless的构造函数(和默认的构造函数结构相同)。
如上面的程序,如果注释public int Class2(){},
编译时便会报错:Class2' does not contain a constructor that takes '0' arguments 。
如果在派生类中显示的说明调用父类的有参构造函数,便不需要Parameterless的构造函数了。
类成员有三类修饰符:Private,Protected和Public。
Private成员只能在类中被引用,
Protected成员只能在类和派生类中被引用,
Public成员可以在任何地方被引用,
这是什么意思呢?派生类只会继承其public和protected成员而不会继承其private成员。如下面的一段程序:
using System.Collections.Generic;
using System.Text;
namespace InheriteLearning
{
class Program
{
static void Main(string[] args)
{
A a = new A();
B b = new B();
b.t = 6;
int hh = b.t;
Console.Read();
}
}
class A
{
public int i = 1;
protected int j = 2;
private int k = 3;
public void did()
{
j = k;
}
}
class B : A
{
new public int i = 2;//隐藏基类成员,需要用new关键字
public int u = 4;
public int k = 5;//由于派生类不继承private成员,因此这里不需要用new关键字
private int q = 6;
public int t
{
get
{
return 4;
}
set
{
q = value;
}
}
//public B firstchild = new B();这段代码是很危险的,他会让你陷入无限的循环中:不停的去实例一个对象,嵌套的。
public void get()
{
B el = new B();
el.k = 5;//可以在派生类中引用protected成员
}
}
}
类实例化一个对象,只是对其中的数据成员进行初始化,如果有自己的构造函数将先进行字段的初始化然后调用构造函数。对于派生类,它首先会实例自身的成员,然后去实例继承的成员。
内存印象中每个对象仅仅保存属于自己的数据成员的副本。
以下摘在:http://blog.chinaunix.net/u1/41167/showart_1084013.html
而成员函数对于整个类而言却是共享的,即一个类只保留一份成员函数。 那么每个对象怎样和这些可以认为是“分离”的成员函数发生联系,即成员函数如何操作对象的数据成员? 记住this指针,无论对象通过(.)操作或者 (->)操作调用成员函数,编译时刻,编译器都会将这种调用转换成我们常见的全局函数的形式, 并且多出一个参数(一般这个参数放在第一个),然后将 this指针传入这个参数。于是就完成了对象与成员函数的绑定(或联系). 实例化后就得到同一个类的多个不同的对象,既然成员函数共享的,那么成员函数就可以操作对象的数据成员。
忙活完了正则表达式,更加细节的字符串处理就需要交给.Net的Sring类处理,它有非常的方法大体可以分为一下几类:
使用 Compare、CompareOrdinal、CompareTo、Equals、EndsWith 和 StartsWith 方法进行比较。
使用 IndexOf、IndexOfAny、LastIndexOf 和 LastIndexOfAny 方法可获取字符串中子字符串或 Unicode 字符的索引。
使用 Copy 和 CopyTo 可将字符串或子字符串复制到另一个字符串或 Char 类型的数组。
使用 Substring 和 Split 方法可通过原始字符串的组成部分创建一个或多个新字符串;使用 Concat 和 Join 方法可通过一个或多个子字符串创建新字符串。
使用 Insert、Replace、Remove、PadLeft、PadRight、Trim、TrimEnd 和 TrimStart 可修改字符串的全部或部分。
使用 ToLower、ToLowerInvariant、ToUpper 和 ToUpperInvariant 方法可更改字符串中 Unicode 字符的大小写。
使用 Format, 可将字符串中的一个或多个格式项占位符替换为一个或多个数字、日期和时间或枚举值的文本表示形式。
使用 Length 属性可获取字符串中 Char 对象的数量;使用 Chars 属性可访问字符串中实际的 Char 对象。
使用 IsNormalized 方法可测试某个字符串是否已规范化为特定的范式。使用 Normalize 方法可创建规范化为特定范式的字符串
(以上摘自MSDN:http://msdn.microsoft.com/zh-cn/library/system.string(VS.80).aspx)
与其相关的还有StringBuild处理字符串类
| 名称 | 说明 | |
|---|---|---|
| Append | 已重载。 在此实例的结尾追加指定对象的字符串表示形式。 | |
| AppendFormat | 已重载。 向此实例追加包含零个或更多格式规范的格式化字符串。每个格式规范由相应对象参数的字符串表示形式替换。 | |
| AppendLine | 已重载。 将默认的行终止符(或指定字符串的副本和默认的行终止符)追加到此实例的末尾。 | |
| CopyTo | 将此实例的指定段中的字符复制到目标 Char 数组的指定段中。 | |
| EnsureCapacity | 确保 StringBuilder 的此实例的容量至少是指定值。 | |
| Equals | 已重载。 返回一个值,该值指示此实例是否与指定的对象相等。 | |
| GetHashCode | 用作特定类型的哈希函数。GetHashCode 适合在哈希算法和数据结构(如哈希表)中使用。 (从 Object 继承。) | |
| GetType | 获取当前实例的 Type。 (从 Object 继承。) | |
| Insert | 已重载。 将指定对象的字符串表示形式插入到此实例中的指定字符位置。 | |
| ReferenceEquals | 确定指定的 Object 实例是否是相同的实例。 (从 Object 继承。) | |
| Remove | 将指定范围的字符从此实例中移除。 | |
| Replace | 已重载。 将此实例中所有的指定字符或字符串替换为其他的指定字符或字符串。 | |
| ToString | 已重载。 已重写。 将 StringBuilder 的值转换为 String。 |
