using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Day02
{
class Program
{
static void Main(string[] args)
{
Student st = new Student();
st.StudentId = Convert.ToInt32(Console.ReadLine());
int id = 30;
int id2 = 40;
Console.WriteLine(st.StudentId);
st.Study(ref id ,out id2);
Console.WriteLine("id:"+id+"\nid2:"+id2); //來驗證ref 和 out都是值傳遞 ref和out見下詳解
}
}
class Student
{
private int studentId;
public int StudentId
{
get { return studentId; }
set
{
if (value > 0)
{
studentId = value;
}
}
}
public void Study(ref int id,out int id1) //public 爲訪問修飾符,void 爲返回類型,Study 爲方法名 ,id爲參數
{
id1 = 2; //使用ref關鍵字注重修改,有進有出,即id值有初始值;而用out關鍵字 注重修改
即,有出無進即id1無初始值需要對id附上初始值
Console.WriteLine(id);
Console.WriteLine(id1);
}
}
}
ref和out關鍵字詳解:
ref側重修改,out注重輸出
方法參數上的 out 方法參數關鍵字使方法引用傳遞到方法的同一個變量。當控制傳遞迴調用方法時,在方法中對參數所做的任何更改都將反映在該變量中。 當希望方法返回多個值時,聲明 out 方法非常有用。使用 out 參數的方法仍然可以返回一個值。一個方法可以有一個以上的 out 參數。 若要使用 out 參數,必須將參數作爲 out 參數顯式傳遞到方法。out 參數的值不會傳遞到 out 參數。
不必初始化作爲 out 參數傳遞的變量。然而,必須在方法返回之前爲 out 參數賦值。
屬性不是變量,不能作爲 out 參數傳遞。方法參數上的 ref 方法參數關鍵字使方法引用傳遞到方法的同一個變量。當控制傳遞迴調用方法時,在方法中對參數所做的任何更改都將反映在該變量中。 若要使用 ref 參數,必須將參數作爲 ref 參數顯式傳遞到方法。ref 參數的值被傳遞到 ref 參數。傳遞到 ref 參數的參數必須最先初始化。將此方法與 out 參數相比,後者的參數在傳遞到 out 參數之前不必顯式初始化。屬性不是變量,不能作爲 ref 參數傳遞。
自己理解:首先:兩者都是按地址傳遞的,使用後都將改變原來的數值。看上述代碼可以很直觀的看出。
其次:rel可以把參數的數值傳遞進函數,但是out是要把參數清空,就是說你無法把一個數值從out傳遞進去的,out進去後,參數的數值爲
空,所以你必須初始化一次。這個就是兩個的區別,或者說就像有的網友說的,rel是有進有出,out是隻出不進。
靜態方法和靜態變量:
靜態方法與靜態變量一樣,屬於類本身,而不屬於那個類的一個對象。調用一個被定義爲static的方法,可以通過在它前面加上這個類的名
稱,也可以像調用非靜態方法一樣通過類對象調用。
實例方法必須通過類的實例來使用。實例方法可以使用類的非靜態成員,也可以使用類的靜態成員。
類的靜態方法,靜態變量是在類裝載的時候裝載的。但是要特別注意,類的靜態變量是該類的對象所共有的,即是所有對象共享變量。所以
建議儘量少用靜態變量。儘量在靜態方法中使用內部變量。
方法聲明
其中static關鍵字即表示靜態的。聲明靜態方法的語法如下:
<訪問修飾符>static返回類型 方法名(參數列表)
{//方法體}
方法調用
靜態方法與實例方法唯一不同的,就是靜態方法在返回類型前加static關鍵字。靜態方法的調用有兩種途徑:
(1)通過類的實例對象去調用
調用格式爲: 對象名.方法名
(2) 通過類名直接調用
調用格式爲: 類名::方法名
方法規則
我們在使用時要注意:
靜態方法只能訪問類的靜態成員,不能訪問類的非靜態成員;
非靜態方法可以訪問類的靜態成員,也可以訪問類的非靜態成員;
靜態方法既可以用實例來調用,也可以用類名來調用。
方法重載注意事項:
(1)方法名一定要相同。
(2)方法的參數表必須不同,包括參數的類型或個數,以此區分不同的方法體。
(a)如果參數個數不同,就不管它的參數類型了!
(b)如果參數個數相同,那麼參數的類型或者參數的順序必須不同。
(3)方法的返回類型、修飾符可以相同,也可不同。
方法重載簡單實例:
public int add(int a,int b){
return a+b;
}
public double add (double a,double b){
return a+b:
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace day2
{
class Program
{
static void Main(string[] args)
{
Student st = new Student(1);
Console.WriteLine(st.Id);
}
}
class Student
{
private int id;
public int Id
{
get { return id; }
set { id = value; }
}
public Student(int cid) /*構造函數,如果不寫此方法,會使用默認構造函數。構造函數的函數名必須與類名一致*/
{
this.id = cid;
}
}
}
構造函數 :
是一種特殊的方法 主要用來在創建對象時初始化對象 即爲對象成員變量賦初始值,總與new運算符一起使用在創建對象的語句中 特別的一個類可以有多個構造函數 可根據其參數個數的不同或參數類型的不同來區分它們 即構造函數的重載