C#基礎回顧(二)—頁面值傳遞、重載與重寫、類與結構體、裝箱與拆箱

一.前言

-孤獨的路上有夢想做伴,乘風破浪-c#

二.頁面值傳遞

(1)C#各頁面之間能夠進行數據的交換和傳遞,頁面之間可根據獲取的數據,進行各自的操做(跳轉、計算等操做)。爲了實現多種方式的數據傳遞,C#提供一下幾種方式:微信

1.Query.String方式cookie

2.Server.Transfer方式session

3.Cookie方式ide

4.Session方式函數

5.Application方式this

(2)實現方式spa

新建TestTransfer項目,添加TransferOne.aspx頁面和TransferTwo.aspx頁面。在TransferOne.aspx中,添加兩個文本框和一個按鈕,用來實現跳轉。在btnLogin_Click中添加實現的邏輯代碼:3d

在TransferTwo.aspx中添加:指針

在Page_Load中添加邏輯實現代碼,

以上就是c#頁面之間傳值的幾種方式,其中Query.String方式在URl地址欄中會顯示傳遞的的參數值信息。

注意:Session與Cookie的區別

因爲Http協議是基於Tcp/Ip的,當用戶從客戶端發送請求到服務端,服務端響應請求,並返回數據給客戶端,這個過程是無狀態的,爲了保存客戶端的某些狀態,所以用到了Session和Cookie機制。

(1)session存儲在服務端,cookie是存儲在客戶端,而且存儲的大小有限制。

(2)session實現的本質是依靠cookie來作的,通常把具備敏感信息的內容用session存儲在服務端,例如密碼等。首先在服務端生成session之後,返回SessionID給客戶端,客戶端Cookie保存SessionID的值,

下次請求的時候帶着SessionID去獲取對應的Session的值。

(3)Cookie存在有效期,能夠設置cookie的有效期。

聲明Cookie的方式:

var cookie = Request.Cookies["user"] ?? new HttpCookie("user");

cookie.Values.Set("username", this.TextBox1.Text);

cookie.Values.Set("password", this.TextBox2.Text);

Response.SetCookie(cookie);

Response.Cookies.Add(cookie);

聲明Session方式:

Session["username"] = this.TextBox1.Text;

Session["password"] = this.TextBox2.Text;

3、重載與重寫、隱藏

(1)定義:

重載:同一個做用域內發生(好比一個類裏面),定義一系列同名方法,可是方法的參數列表不一樣。這樣才能經過傳遞不一樣的參數來決定到底調用哪個。返回類型能夠相同也能夠不一樣。

重寫:繼承時發生,在子類中從新定義父類中的方法,子類中的方法和父類的方法是同樣的。例如:基類方法聲明爲virtual(虛方法),派生類中使用override申明此方法的重寫.

隱藏:基類方法不作申明(默認爲非虛方法),在派生類中使用new聲明此方法的隱藏。子類覆蓋基類的方法,其返回值類型必須相同。

(2)實現Demo

static void Main(string[] args)

{

var coderOne=new DoWork();

coderOne.DoCoding("liupeng");

coderOne.DoCoding("liupeng", 24);

var coderTwo=new SubDoWork();

coderTwo.Say();

//隱藏基類的方法

coderTwo.EnjoyLife();

//經過實例化的對象,決定調用基類仍是子類中的方法

coderOne.EnjoyLife();

Console.ReadKey();

}

public class DoWork

{

public virtual void Say()

{

Console.WriteLine("I am in Base Calss,Hello Everyone!");

}

public void EnjoyLife()

{

Console.WriteLine("I am a Coder, but I like my life, Coding is my life,also is my girl! Haha!");

}

public void DoCoding(string name)

{

Console.WriteLine(string.Format("My name is {0},I love coding!", name));

}

public void DoCoding(string name, int age)

{

Console.WriteLine(string.Format("My name is {0},age is {1},I always love coding!", name, age));

}

}

public class SubDoWork : DoWork

{

public override void Say()

{

Console.WriteLine("I am in SubClass,Hello Everybody!");

}

new public void EnjoyLife()

{

Console.WriteLine("I am a  new bird ,i must work hard to achieve my dream!");

}

}

4、類與結構體

1.關於類和結構體的區別:

(1)類中傳遞的內容是存儲在託管堆中,而結構體中傳遞的內容是存儲在棧中。

(2)類中傳遞的對象修改的時候,將修改源對象;而結構體中的對象修改時,源對象不會改變,保持原來的狀態。

(3)類中的構造函數,能夠是默認無參的構造函數,也能夠是有參數的構造函數;但結構中的構造函數必須爲有參數的構造函數,不能爲默認的構造函數。

2.實現Demo

static void Main(string[] args)

{

Console.WriteLine("-----------初始化以前的字段的值--------------");

var studentOne = new StuName("zhangyonghe", 26);

var studentTwo = new StructStuName("liupeng", 25);

studentOne.SayHello();

studentTwo.SayHello();

Console.WriteLine("--------------修改對象的傳遞時的值------------");

var studentOneNew = studentOne;

studentOne.Age = 30;

studentOne.SayHello();

var studentTwoNew = studentTwo;

studentTwoNew.Age = 35;

studentTwo.SayHello();

Console.ReadKey();

}

public class StuName

{

public string Name { get; set; }

public int Age { get; set; }

public StuName(string name, int age)

{

this.Name = name;

this.Age = age;

}

public void SayHello()

{

Console.WriteLine(string.Format("Class類結構的姓名爲:{0},年齡爲:{1}", Name, Age));

}

}

public struct StructStuName

{

public string Name;

public int Age;

//結構體的構造函數必須滴啊有參數

public StructStuName(string name, int age)

{

Name = name;

Age = age;

}

public void SayHello()

{

Console.WriteLine(string.Format("Struct結構的姓名是:{0},年齡是:{1}", Name, Age));

}

}

運行結果爲:

五.裝箱與拆箱

(1)定義:將值類型轉化爲引用類型爲裝箱;將引用類型轉化爲值類型稱之爲拆箱。

(2)熟悉一段代碼:

public void Method1(){

// Line 1

int i=4;

// Line 2

int y=2;

//Line 3

class1 cls1 = new class1();

}

此時,程序是這樣解析的:

(1)先在棧上根據值類型的大小分配相應的內存空間,將值類型變量的Value存在棧空間上。

(2)當執行到實例化一個對象cls1時,編譯器在站上建立了一個指針,真實的對象存儲在另外一種叫「堆」的內存中。

"堆"並不跟蹤運行內存,它更像一堆隨時能夠訪問的對象。堆用於動態分配內存。這裏須要着重說明的是引用指針是分配在棧上。

聲明Class1 cls1時並不會給Class1的實例分配內存,而是分配一個棧變量cls1(並設置爲null),而後把它指向「堆」。

當咱們在初始化一個對象,並將cls1賦給cls2的時候,實際上是在stack上面建立一個棧變量,並把變量的指針指向cls1對象的引用。

而後咱們看看拆箱的過程發生了什麼?

int i=4;

object o=i;

int j=(int)o;

拆箱的過程:

(1). 檢查實例:首先檢查變量的值是否爲null,若是是則拋出NullReferenceException異常;再檢查變量的引用指向的對象是否是給定值類型的已裝箱對象,若是不是,則拋出InvalidCastException異常。

(2). 返回地址:返回已裝箱實例中屬於原值類型字段的地址,而兩個額外成員(類型對象指針和同步塊索引)則不會返回。

到此,拆箱過程已經結束,可是伴隨着拆箱,「每每」(《CLR via C#》中的描述,用的是」每每「,而並無說必定)會緊接着發生一次字段的複製操做。

實際上就是講已裝箱對象中的實例字段拷貝到內存棧上。

一個本身維護的微信公衆號,目前文章很少,但願接下來的日子,會一直更新下去,寫本身的生活,分享技術,但願熱愛生活的技術宅,一塊兒交流!

相關文章
相關標籤/搜索