学习随笔

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 之间的差异。
装箱转换

BoxingConversion 图

取消装箱转换

图:取消装箱转换
要在运行时成功取消装箱值类型,被取消装箱的项必须是对一个对象的引用,该对象是先前通过装箱该值类型的实例创建的。尝试取消装箱  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),里面的就不会执行.
Page_Load这个方法是每次请求页面都要执行的,如果不加!IsPostBack时.
在你点击button的时候先执行Page_Load中的
 txbY.Text = Convert.ToString(Session["Name"]);
那么你在页面中输入的值就被这句给替换掉了.
 
6.   构造函数
除非类是  static  的,否则 C# 编译器将为无构造函数的类提供一个公共的默认构造函数,以便该类可以实例化。
注: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();
        }
    }
    class B : A
    {
       public override void zl()
        {
            Console.WriteLine("这是李紫薇");
            Console.ReadKey();
        }
    }

    class Test
    {
        static void Main()
        {
            B b = new B();
            A a = b;
            a.zl();
        }
    }
    //打印:
    //这是李紫薇
    #endregion
 
12、枚举
  //声明枚举
  enum Days { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };
  //获得枚举键值
 int i = (int)Days.Friday;----------(1)
 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;
        //跳转页面传参并对字符串进行URL编码(针对可能出现汉字)
        Response.Redirect("Default3.aspx?shuju="+Server.UrlEncode( TextBox1.Text));
        //获取传值(并进行url解码,针对汉字)
        TextBox3.Text =Server.UrlDecode( Request.Params["shuju"].ToString());
        //解码html代码
        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.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();
        }
    }

注意:两个类相引用,依次执行代码。在第三个类里引用则依次调用按照正常逻辑。

转载于:https://www.cnblogs.com/loalongblogs/articles/1967933.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值