学习随笔
1.值类型:数值类型,bool,结构。
引用类型:类,接口,string,object。
// 值类型变量
public static void Main(string[] args)
{
int a = 5;
b = a; // 需要关键理解的地方
b = 10;
Console.WriteLine(b); // 打印输出 10
Console.ReadLine();
}
// 引用类型变量
public static void Main(string[] args)
{
Student stu1 = new Student();
Student stu2 = new Student();
stu1.Name = "周杰伦";
stu2 = stu1; // 需要关键理解的地方!!!
stu2.Name = "方文山";
Console.WriteLine(stu1.Name); // 打印输出 方文山
Console.ReadLine();
}
但是这里需注意,string/字符串 类型对象具有不可变性。结果都是以新字符串形式返回,对新字符串引用中断。
string s1 = "Hello "; string s2 = s1; s1 += "World"; System.Console.WriteLine(s2); //Output: Hello
2.i++:先引用再自加。++i:先自加再引用。i+=n:i 递增 n。
3.以下语句对变量 i 隐式应用装箱操作:object o = i; // Implicit boxing
此语句的结果是在堆栈上创建对象引用 o,而在堆上则引用 int 类型的值。该值是赋给变量 i 的值类型值的一个副本。下图说明了两个变量 i 和 o 之间的差异。
要在运行时成功取消装箱值类型,被取消装箱的项必须是对一个对象的引用,该对象是先前通过装箱该值类型的实例创建的。尝试取消装箱 null 或对不兼容值类型的引用会导致InvalidCastException(因无效类型转换或显式转换引发的异常).
4.switch中的goto.....
class SwitchTest { static void Main() { Console.WriteLine("Coffee sizes: 1=Small 2=Medium 3=Large"); Console.Write("Please enter your selection: "); string s = Console.ReadLine(); int n = int.Parse(s); int cost = 0; switch (n) { case 1: cost += 25; break; case 2: cost += 25; goto case 1; case 3: cost += 50; goto case 1; default: Console.WriteLine("Invalid selection."); break; } if (cost != 0) { Console.WriteLine("Please insert {0} cents.", cost); } Console.WriteLine("Thank you for your business."); } } /* Sample Input: 2 Sample Output:
Coffee sizes: 1=Small 2=Medium 3=Large Please enter your selection: 2 Please insert 50 cents. Thank you for your business. */
5. Ispostback的运用
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
txbY.Text = Convert.ToString(Session["Name"]);
}
}
protected void btn_Click(object sender, EventArgs e)
{
Session["Name"] = txbY.Text.Trim();
Session["URL"] = "Default.aspx";
Response.Redirect("UnBack.aspx");
}
页面生命周期.
Page_Load 比btn_Click事件先执行. 如果没有if (!IsPostBack)
先执行txbY.Text = Convert.ToString(Session["Name"]);
再执行Session["Name"] = txbY.Text.Trim();
session不变
button点击是postback.加上if (!IsPostBack),里面的就不会执行.
先执行txbY.Text = Convert.ToString(Session["Name"]);
再执行Session["Name"] = txbY.Text.Trim();
session不变
button点击是postback.加上if (!IsPostBack),里面的就不会执行.
Page_Load这个方法是每次请求页面都要执行的,如果不加!IsPostBack时.
在你点击button的时候先执行Page_Load中的
txbY.Text = Convert.ToString(Session["Name"]);
那么你在页面中输入的值就被这句给替换掉了.
在你点击button的时候先执行Page_Load中的
txbY.Text = Convert.ToString(Session["Name"]);
那么你在页面中输入的值就被这句给替换掉了.
6. 构造函数
注:static类与非静态类基本相同,但存在一个区别:静态类不能实例化。
构造函数使得程序员可设置默认值、限制实例化以及编写灵活且便于阅读的代码。
(2.)过将构造函数设置为私有构造函数,可以阻止类被实例化,如下所示:
class NLog { // Private Constructor: private NLog() { } public static double e = Math.E; //2.71828... }
在派生类中,如果不使用 base 关键字来显式调用基类构造函数,则将隐式调用默认构造函数(如果有的话)。这意味着下面的构造函数声明在效果上是相同的:
只是。简而言之就是派生类中不用base指定调用基类构造函数的话,将默认调用基类默认构造函数。
Manager(int initialdata)带了个参数进入。
public Manager(int initialdata) { //Add further instructions here. }
public Manager(int initialdata) : base() { //Add further instructions here. }
静态构造函数具有以下特点:
-
静态构造函数既没有访问修饰符,也没有参数。
-
在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。
-
无法直接调用静态构造函数。
-
在程序中,用户无法控制何时执行静态构造函数。
-
静态构造函数的典型用途是:当类使用日志文件时,将使用这种构造函数向日志文件中写入项。
-
静态构造函数在为非托管代码创建包装类时也很有用,此时该构造函数可以调用 LoadLibrary 方法。
-
如果静态构造函数引发异常,运行时将不会再次调用该构造函数,并且在程序运行所在的应用程序域的生存期内,类型将保持未初始化。
结构是一种值类型。创建结构时,结构赋值到的变量保存该结构的实际数据。将结构赋给新变量时,将复制该结构。因此,新变量和原始变量包含同一数据的两个不同的副本。
对一个副本的更改不影响另一个副本。
每个构造函数会初始化成员变量:
int i;
int b;
public zl()
{
// i = 0; -----构造函数会初始化成员变量
//b = 0;
}
public zl(int t):this()------当其它构造函数继承默认构造函数后会防止成员变量重新初始化,直接调用默认构造函数。防止数据冗余。
{
i ---0= t;
b ---0= t;
Console.WriteLine("{0},{1}", i, b);
}
7.字符串
拆分字符串 使用 String.Split 方法分析字符串(也可以理解为指定分隔符)。
例:
class TestStringSplit { static void Main() { char[] delimiterChars = { ' ', ',', '.', ':', '\t' }; string text = "one\ttwo three:four,five six seven"; System.Console.WriteLine("Original text: '{0}'", text); string[] words = text.Split(delimiterChars); System.Console.WriteLine("{0} words in text:", words.Length); foreach (string s in words) { System.Console.WriteLine(s); } // Keep the console window open in debug mode. System.Console.WriteLine("Press any key to exit."); System.Console.ReadKey(); } } /* Output: Original text: 'one two three:four,five six seven' 7 words in text: one two three four five six seven */
注意:每个分隔符前面的内容加入数组,空的也加入为空。
int.TryParseint.TryParse(input1, out result) 判断是否能将input1装换为int32类型,其是bool类型。
转换成功 result返回input1值否则不成功返回0.
8、递归:
//计算n!
private long f(int n)
{
if (n == 1) ----变量越变越小有终点
return 1;
long ret;
ret = f(n - 1) + n;-------变量越变越小
return ret;
}
9、泛型
运用实例:
// Declare the generic class. public class GenericList<T> { void Add(T input) { } } class TestGenericList { private class ExampleClass { } static void Main() { // Declare a list of type int. GenericList<int> list1 = new GenericList<int>(); // Declare a list of type string. GenericList<string> list2 = new GenericList<string>(); // Declare a list of type ExampleClass. GenericList<ExampleClass> list3 = new GenericList<ExampleClass>(); } }
10、委托
//声明委托(返回值,参数类型必须和调用方法一样)
delegate void lzwz1(string a); class zl
{
static void lzw(string l)
{
Console.WriteLine("老张吃" + l);
Console.ReadKey(true);
}
static void lzwzl(string t)
{
Console.WriteLine("老李吃" + t);
Console.ReadKey(true);
}
static void Main()
{
// 实例化委托(指明调用方法)
lzwz1 h = new lzwz1(lzw);
lzwz1 h1=new lzwz1 (lzwzl);
//运行方法(加入参数)
h("苹果");
h("西瓜");
//声明委托队列
lzwz1 j = null;
j= h + h1;
//委托匿名方法(不指明调用方法)
j += delegate (string p) { Console.WriteLine("老zhao吃" + p); Console.ReadKey(true); };
j("芒果");
}
}
11、虚方法
#region 虚方法
class A
{
public virtual void zl()
{
Console.WriteLine("这是张龙");
Console.ReadKey();
}
}
{
public virtual void zl()
{
Console.WriteLine("这是张龙");
Console.ReadKey();
}
}
class B : A
{
public override void zl()
{
Console.WriteLine("这是李紫薇");
Console.ReadKey();
}
}
{
public override void zl()
{
Console.WriteLine("这是李紫薇");
Console.ReadKey();
}
}
class Test
{
static void Main()
{
B b = new B();
A a = b;
a.zl();
}
}
//打印:
//这是李紫薇
#endregion
//这是李紫薇
#endregion
12、枚举
//声明枚举
enum Days { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };
//获得枚举键值
int i = (int)Days.Friday;----------(1)
TextBox2.Text = i.ToString();
TextBox2.Text = i.ToString();
TextBox1.Text = ((int)((Days)3)).ToString();---------------(2)
foreach(string t in Enum.GetNames(typeof(Days)))--------------(3)
Response.Write(t+"<br>");
foreach (int r in Enum.GetValues(typeof(Days)))----------------(4)
Response.Write(r + "<br>");
13、ASP.NET基本对象
//为Application和Session赋值
Application.Lock();
Application["zl"] = TextBox1.Text;
Application.UnLock();
Button1.Text = Application["zl"].ToString();
Session["zl"] = TextBox2.Text;
Application["zl"] = TextBox1.Text;
Application.UnLock();
Button1.Text = Application["zl"].ToString();
Session["zl"] = TextBox2.Text;
//跳转页面传参并对字符串进行URL编码(针对可能出现汉字)
Response.Redirect("Default3.aspx?shuju="+Server.UrlEncode( TextBox1.Text));
Response.Redirect("Default3.aspx?shuju="+Server.UrlEncode( TextBox1.Text));
//获取传值(并进行url解码,针对汉字)
TextBox3.Text =Server.UrlDecode( Request.Params["shuju"].ToString());
TextBox3.Text =Server.UrlDecode( Request.Params["shuju"].ToString());
//解码html代码
string s;
s="<P><FONT color=#ff0000>dsadadadadadsada</FONT></P>";
Response.Write( Server.HtmlDecode(s));
string s;
s="<P><FONT color=#ff0000>dsadadadadadsada</FONT></P>";
Response.Write( Server.HtmlDecode(s));
//请求超时值
Response.Write(Server.ScriptTimeout.ToString() + "<br>");
//虚拟路径
Response.Write(Request.ApplicationPath + "<br>");
//服务器名
Response.Write(Server.MachineName + "<br>");s
Response.Write(Server.ScriptTimeout.ToString() + "<br>");
//虚拟路径
Response.Write(Request.ApplicationPath + "<br>");
//服务器名
Response.Write(Server.MachineName + "<br>");s
Response.Write("指定虚拟路径相对物理路径"+Server.MapPath("~")+"<br>");
14、抽象函数和虚函数的区别
抽象方法必须由派生的子类来实现
而虚方法派生的子类不一定会重写
虚方法在基类中可以有实现,但抽象方法不能。
虚方法可以在子类中不实现,但抽象方法必须在子类中全部实现。
虚方法提供了满足基本需要的代码,一般情况下不需要客户端重新写,如果满足不了,客户端可以覆盖。
抽象方法在抽象类中,通常抽象类提供模板方法的实现,模板方法需要一些接口,但是必须由客户端提供,抽象方法就是定义这些接口。
当觉得一个方法要实现什么功能,并且知道怎么实现功能的时候,用虚方法.
当知道方法要实现的功能,但对怎么实现不清楚的时候,用抽象方法
抽象方法是需要子类去实现的
虚方法,是已经实现了,子类可以去覆盖,也可以不覆盖
而虚方法派生的子类不一定会重写
虚方法在基类中可以有实现,但抽象方法不能。
虚方法可以在子类中不实现,但抽象方法必须在子类中全部实现。
虚方法提供了满足基本需要的代码,一般情况下不需要客户端重新写,如果满足不了,客户端可以覆盖。
抽象方法在抽象类中,通常抽象类提供模板方法的实现,模板方法需要一些接口,但是必须由客户端提供,抽象方法就是定义这些接口。
当觉得一个方法要实现什么功能,并且知道怎么实现功能的时候,用虚方法.
当知道方法要实现的功能,但对怎么实现不清楚的时候,用抽象方法
抽象方法是需要子类去实现的
虚方法,是已经实现了,子类可以去覆盖,也可以不覆盖
1. 虚方法必须有实现部分,抽象方法没有提供实现部分,抽象方法是一种强制派生类覆盖的方法,否则派生类将不能被实例化。
2. 抽象方法只能在抽象类中声明,虚方法不是。其实如果类包含抽象方法,那么该类也是抽象的,也必须声明为抽象的。
3. 抽象方法必须在派生类中重写,这一点跟接口类似,虚方法不必。
4.虚函数可以实现多态,而抽象函数不行。
15、实列
public class A
{
public static int X;
static A()
{
X = B.Y + 1;
}
}
class B
{
public static int Y = A.X + 1;
static B()
{
//Console.Write("z;");
//Y = 100;
}
static void Main()
{
Console.WriteLine("X={0},Y={1}", A.X, B.Y);
Console.ReadKey();
}
}
注意:两个类相引用,依次执行代码。在第三个类里引用则依次调用按照正常逻辑。