C#的一些筆記
???????? C#的函數(shù)&方法
解釋:
函數(shù)就是講一堆代碼進(jìn)行重用的一種機(jī)制,函數(shù)就是一堆代碼,這段代碼可能有輸入的值(參數(shù)),可能會(huì)返回值,一個(gè)函數(shù)就像一個(gè)專門做這件事的人,我們調(diào)用他來做一些事情,他可能需要我們提供一些數(shù)據(jù)給他,他執(zhí)行完后可能會(huì)有一些執(zhí)行結(jié)果給我們。要求的數(shù)據(jù)就叫參數(shù),返回值的執(zhí)行結(jié)果就是返回值。
函數(shù)的語法
訪問修飾符? ? 修飾符? ? 返回值類型? ? 方法名(參數(shù)列表)
{
? ? 語句塊;
}
[public] static 返回值類型 方法名([參數(shù)列表])
{
?????? 方法體;
}
Public:訪問修飾符,公開的,公共的,那都可以訪問
public
成員可以被任何代碼訪問。
2) private
成員僅能被同一個(gè)類中的代碼訪問,如果在類成員前未使用任何訪問修飾 符,則默認(rèn)為private。
3) internal
成員僅能被同一個(gè)項(xiàng)目中的代碼訪問。
4) protected
受保護(hù)的明知呢個(gè)在當(dāng)前類的內(nèi)部以及該類的子類中訪問
Static:靜態(tài)的(修飾符)
返回值類型:如果不需要寫返回值,寫void
方法名:Pascal 每個(gè)單詞的首字母大寫,其余字母小寫
參數(shù)列表:完成這個(gè)方法必須提供給這個(gè)方法的條件。如果沒有參數(shù)小括號(hào)也不能省略
?
方法寫好之后,如果想執(zhí)行,必須要在Main函數(shù)里進(jìn)行調(diào)用。
方法的調(diào)用語法:
關(guān)鍵字 變量名 = 類名.方法名(參數(shù));
在某些情況下,類名是可以省略的,如果你寫的方法跟Main()函數(shù)在同一個(gè)類中,這個(gè)時(shí)候,類名可以省略。
Return
1、? 在方法中返回要返回的值
2、? 立即結(jié)束本次方法
?
例如:
namespace ConsoleApp29
{
??? internal class Program
??? {
??????? static void Main(string[] args)
??????? {
??????????? //計(jì)算兩個(gè)整數(shù)之間的最大值
??????????? int max = Program.GetMax(1, 3);
??????????? Console .WriteLine (max);
??????????? Console.ReadKey();
??????? }
??????? /// <summary>
??????? /// 計(jì)算兩個(gè)整數(shù)之的最大值并且將最大值返回
??????? /// </summary>
??????? /// <param name="n1">第一個(gè)整數(shù)</param>
??????? /// <param name="n2">第二個(gè)整數(shù)</param>
??????? /// <returns>將最大值返回</returns>
??????? public static int GetMax(int n1,int n2 )
??????? {
??????????? return? n1>n2 ? n1 : n2;
??????? }
??? }
}
函數(shù)&方法的調(diào)用
我們?cè)谠贛ain()函數(shù)中,調(diào)用Test()函數(shù),我們管Main()函數(shù)稱之為調(diào)用者,管Test()函數(shù)稱之為被調(diào)用者。
如果被調(diào)用者想要得到調(diào)用者的值
1,? 傳遞參數(shù)
2,? 使用靜態(tài)字段來模擬全局變量(C#當(dāng)中沒有全局變量)public static int _number = 10;(聲明到類當(dāng)中)
3,? 返回值
2,不管是實(shí)參或是形參都是在內(nèi)存里開辟了一塊空間的
static void Main(string[] args)
??????? {
??????????? //比較兩個(gè)數(shù)字的大小
??????????? int n1 = 10;
??????????? int n2 = 20;
??????????? GetMax(n1,n2);//實(shí)參
??????? }
??????? /// <summary>
??????? /// 計(jì)算兩個(gè)整數(shù)之間的最大值 并返回最大值
??????? /// </summary>
??????? /// <param name="n1">第一個(gè)數(shù)</param>
??????? /// <param name="n2">第二個(gè)數(shù)</param>
??????? /// <returns>返回ide最大值</returns>
??????? public static int? GetMax(int n1,int n2)//形參
??????? {
??????????? int max =n1 > n2 ? n1 : n2;
??????????? return max;
??????? }
方法功能一定要單一?。。?/p>
不要提示用戶輸入在函數(shù)和方法中
?????????????????????????????????????? 特殊參數(shù)
Out參數(shù)
釋義:如果你在一個(gè)方法里,返回了多個(gè)相同類型的值的時(shí)候,可以考慮返滬一個(gè)數(shù)組。但是,如果返回多個(gè)不同類型的值的時(shí)候,返回?cái)?shù)組就不行了。,那么這個(gè)時(shí)候數(shù)組就不行了,那么這個(gè)時(shí)候,我們可以考慮使用out參數(shù)。
Out參數(shù)就側(cè)重于在一個(gè)方法中可以返回多個(gè),要求方法內(nèi)部變量賦值
不同類型的值
Out的應(yīng)用
public static void Test(int[] nums,out int max,out int min,out int sum,out int avg)在行參列表之中協(xié)商要多余返回的那幾個(gè)值(out參數(shù)要求在方法內(nèi)部必須對(duì)其進(jìn)行賦值)
?{
???????
?}
用數(shù)組:
namespace Out參數(shù)
{
??? internal class Program
??? {
??????? static void Main(string[] args)
??????? {
??????????? int[] numbers = {1,2,3,4,5,6,7,8,9};
??????????? //將要返回的四個(gè)值,放到一個(gè)數(shù)組中返回
??????????? int[] res=GetMaxMinSunAvg (numbers);
??????????? Console.WriteLine("最大值是{0},最小值{1},總和{2},平均值{3}", res[0], res[1], res[2], res[3]);
??????????? Console.ReadKey();
??????? }
??????? /// <summary>
??????? /// 計(jì)算一個(gè)數(shù)組的最大值,最小值,總和,平均值
??????? /// </summary>
??????? /// <param name="nums"></param>
??????? /// <returns></returns>
??????? public static int[] GetMaxMinSunAvg(int[]nums)
??????? {
??????????? int[] res = new int[4];
??????????? //假設(shè) res[0]最大值 res[1]最小值 res[2]總和 res[3]平均值
??????????? res[0] =nums[0];//max最大值
??????????? res[1] =nums[0];//min最小值
??????????? res[2] = 0;//sum總和
?
??????????? for (int i = 1; i < nums.Length; i++)
??????????? {
??????????????? //如果當(dāng)前循環(huán)的元素比我假定的還大
??????????????? if(nums[i]>res[0])
??????????????? {
??????????????????? //將當(dāng)前循環(huán)的元素賦值給我的最大值
??????????????????? res[0] = nums[i];
??????????????? }
??????????????? if(nums[i]>res[1])
??????????????? {
??????????????????? //最小值
??????????????????? res[1] = nums[i];
??????????????? }
??????????????? res[2]+=nums [i];
??????????? }
??????????? res[3] = res[2] / nums.Length;
??????????? return res;
?
??????? }
??? }
}
用Out參數(shù)
namespace Out
{
??? internal class Program
??? {
??????? static void Main(string[] args)
??????? {
??????????? int[] number = { 0,1,2,3,4,5,6,7,8,9};
??????????? int max = 0;
??????????? int min = 0;
??????????? int sum = 0;
??????????? int avg = 0;
??????????? Test(number, out max, out min, out sum, out avg);
??????????? Console.WriteLine(max );
??????????? Console.WriteLine(min );
??????????? Console.WriteLine(sum );
??????????? Console.WriteLine(avg );
??????????? Console.ReadKey();
??????? }
??????? /// <summary>
??????? /// 計(jì)算一個(gè)數(shù)組的最大值,最小值,平均值,總和
??????? /// </summary>
??????? /// <param name="nums">要求值得數(shù)組</param>
??????? /// <param name="max">多余返回的最大值</param>
??????? /// <param name="min">多月返回的最小值</param>
??????? /// <param name="sum">多月返回的總和</param>
??????? /// <param name="avg">多于返回的平均值</param>
??????? public static void Test(int[] nums,out int max,out int min,out int sum,out int avg)
??????? {
???????????? max = nums[0];
???????????? min = nums[0];
???????????? sum = 0;
??????????? for (int i=0; i < nums.Length; i++)
??????????? {
??????????????? //最大值
??????????????? if (nums[i] > max)
??????????????? {
??????????????????? max = nums[i];
??????????????? }
??????????????? //最小值
??????????????? if (nums[i] < min)
??????????????? {
??????????????????? min = nums[i];
??????????????? }
??????????????? //總和
??????????????? sum += nums[i];
?
??????????? }
??????????? //平均值
??????????? avg = sum / nums.Length;
????? ??}
??? }
}
Out 2
namespace ConsoleApp2
{
??? internal class Program
??? {
??????? static void Main(string[] args)
??????? {
??????????? Console.WriteLine("請(qǐng)輸入用戶名");
??????????? string userName = Console.ReadLine ();
??????????? Console.WriteLine("請(qǐng)輸入密碼");
??????????? string userPwd = Console.ReadLine();
??????????? string msg;
??????????? bool b= IsLogin(userName, userPwd, out msg);
??????????? Console.WriteLine("登錄結(jié)果{0}", b);
??????????? Console.WriteLine("登錄信息{0}", msg);
??????????? Console.ReadKey();
?
?
??????? }
??????? /// <summary>
??????? /// 判斷用戶是否登陸成功
??????? /// </summary>
??????? /// <param name="name">用戶名</param>
??????? /// <param name="pwd">密碼</param>
??????? /// <param name="msg">多余返回的登錄信息</param>
??????? /// <returns>返回登陸結(jié)果</returns>
??????? public static bool IsLogin(string name,string pwd,out string msg)
??????? {
??????????? if (name == "admin"&&pwd == "123456")
??????????? {
??????????????
??????????????? msg = "登陸成功";
??????????????? return true;
??????????? }
??????????? else if (name == "admin")
??????????? {
??????????????? msg = "密碼錯(cuò)誤";
??????????????? return false;
??????????? }
??????????? else if( pwd =="123456")
??????????? {
??????????????? msg = "用戶名錯(cuò)誤";
??????????????? return false;
??????????? }
??????????? else
????? ??????{
??????????????? msg = "未知錯(cuò)誤";
??????????????? return false;
??????????? }
Ref參數(shù)
釋義:能夠讓幾個(gè)變量帶入一個(gè)方法中進(jìn)行改變,改變完成后,再講改變之后的值帶出方法,ref參數(shù)要求在方法外必須賦值,而方法內(nèi)可以不賦值。
?
(可以不用寫返回值只寫一個(gè)void)
實(shí)例:
static void Main(string[] args)
{
//工資5000
double salary = 5000;
//調(diào)用JiangJin方法
JiangJin(ref salary);
Console.WriteLine(salary );
Console.ReadKey();
}
//獲得獎(jiǎng)金之后工資+500
public static void JiangJin(ref double s)
{
s += 500;
}
實(shí)例
static void Main(string[] args)
??????? {
??????????? int n1 = 10;
??????????? int n2 = 20;
??????????? Test(ref n1,ref n2);
??????????? Console.WriteLine(n1);
??????????? Console.WriteLine(n2);
??????????? Console.ReadKey();
??????? }
??????? public static void Test(ref int n1,ref int n2)
??????? {
??????????? int temp = n1;
??????????? n1 = n2;
??????????? n2 = temp;
?
??????? }
Params可變參數(shù)
釋義:將實(shí)參列表中跟可變參數(shù)數(shù)組類型一致的元素都當(dāng)做數(shù)組的元素,params可變參數(shù)必須是形參列表中的最后一個(gè)元素。
實(shí)例1
static void Main(string[] args)
{
?
Test("張三", 99,88,77);
Console.ReadKey();
}
public static void Test(string name ,params int[] score)
{
int sum = 0;
for (int i=0;i<score.Length; i++)
{
sum += score[i];
}
Console .WriteLine ("{0}這次考試的總成績是{1}",name ,sum );
}
方法的重載
概念:方法的重載指的就是方法的名稱相同,但是參數(shù)不同
參數(shù)不同,分為兩種情況
1,? 如果參數(shù)的個(gè)數(shù)形同,那么參數(shù)的類型就不能相同。
2,? 如果參數(shù)的類型相同,那么參數(shù)的個(gè)數(shù)就不能相同。
***發(fā)方法的重載跟返回值沒有關(guān)系。
?public static void M(int n1, int n2)
{
int result = n1 + n2;
}
public static double M(double d1, double n2)
{
return d1 + n2;
}
public static void M(int n1, int n2, int n3)
{
int result = n1 + n2 + n3;
}
public static string M(string s1, string s2)
{
return s1 + s2;
}
方法的遞歸
方法自己調(diào)用用自己
找出文件夾中所有文件
面向?qū)ο?/strong>
面向過程>>>>面向?qū)ο?/p>
面向?qū)ο螅好嫦虻氖峭瓿蛇@件事的過程,強(qiáng)調(diào)是完成這件事的動(dòng)作。
如果我們用面向過程的思想來解決這件事,當(dāng)執(zhí)行這件事的人的不同的時(shí)候,我們需要位每個(gè)不同的人量身定做解決事情的方法。
面向?qū)ο螅赫覀€(gè)對(duì)象幫你做事(通用的代碼)
把大象放進(jìn)冰箱里
我們把冰箱作為對(duì)象:
1,? 冰箱門可以被打開
2,? 大象可以被塞進(jìn)冰箱里
3,? 冰箱門可以被關(guān)閉
?
A 調(diào)用 函數(shù)1
A 調(diào)用 函數(shù)2——通用,誰都可以使用方法(同理B,C,D都可以使用方法完成把大象放進(jìn)冰箱)
A 調(diào)用 函數(shù)3
?
面向?qū)ο螅阂庠趯懗鲆粋€(gè)通用的代碼,屏蔽差異
面向過程:關(guān)門
張三 一腳踹開門
李四 輕輕的·關(guān)門
王五 們沒關(guān)嚴(yán),留了個(gè)尾巴
?
面向?qū)ο螅洪T(對(duì)象一般都是被動(dòng)的)
門可以被關(guān)閉 張三,李四,王五都可以關(guān)閉門
?
我們?cè)诖a中描述一個(gè)對(duì)象,通過描述這個(gè)對(duì)象的屬性和方法
對(duì)象是看得見摸得著的
我們把這些具有相同屬性和相同方法的對(duì)象進(jìn)行進(jìn)一步的封裝,抽象出來,類這個(gè)概念。類就是個(gè)模子,去定了對(duì)象應(yīng)該具有的屬性和方法。對(duì)象是根據(jù)類創(chuàng)建出來的類是抽象的,對(duì)象是實(shí)在的
類
類:類是模子,確定對(duì)象將會(huì)擁有的特這個(gè)(屬性)和行為(方法)
類:類就是一個(gè)蓋大樓的圖紙 對(duì)象:就是改出來的大樓。
?
語法:
public class 類名
{
?????? 字段;(存儲(chǔ)數(shù)據(jù)的)
?????? 屬性;(屬性的作用是保護(hù)字段,對(duì)字段的復(fù)制和取值進(jìn)行限定)
方法;(函數(shù))
}
寫好一個(gè)類之后,我們需要?jiǎng)?chuàng)建這個(gè)類的對(duì)象,那么,我們管創(chuàng)建這個(gè)類的對(duì)象的過程稱之為類的實(shí)例化。
使用關(guān)鍵字new
This:表示這個(gè)類的對(duì)象。
類是不占內(nèi)存的,而對(duì)象是占內(nèi)存的
屬性的·本質(zhì)就是兩個(gè)方法,一個(gè)get{ }一個(gè)set{ }
Field字段
Method方法
Property屬性
當(dāng)你輸出屬性的值的時(shí)候,會(huì)執(zhí)行g(shù)et方法
get { return _name;}
當(dāng)你給屬性賦值的時(shí)候,首先會(huì)執(zhí)行set方法
set { _name = value;}
?
Value是參數(shù),外邊傳的參數(shù)賦值給字段
Person類:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
?
namespace ConsoleApp46
{
??? internal class person
??? {
??????? private string _name;
?
??????? public string Name
??????? {
??????????? get {
??????????????? if (_name !="孫全")
??????????????? {
??????????????????? return _name="孫全";
??????????????? }
??????????????? return _name; }
??????????? set { _name = value; }
??????? }
???????? private int _age;
?
??????? public int Age
??????? {
??????????? get { return _age; }
??????????? set {
???????????????
??????????????? if (value <0||value >100)
??????? ????????{
??????????????????? value = 0;
??????????????? }
??????????????? _age = value; }
??????? }
??????? char _gender;
?
??????? public char Gender
??????? {
??????????? get {
??????????????? if (_gender !='男'&&_gender !='女')
??????????????? {
??????????????????? return _gender;
??????????????? }
???????????????
??????????????? return _gender; }
??????????? set { _gender = value; }
??????? }
?????
?
??????? public void SayHello()
??????? {
??????????? Console.WriteLine("我叫{0},我今年{1}歲了,是{2}生",this.Name ,this.Age ,this.Gender);
??????? }
???????
?
???????
?
?
??? }
}
調(diào)用
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
?
namespace ConsoleApp46
{
??? internal class Program
??? {
??????? static void Main(string[] args)
??????? {
??????????? person p = new person();
??????????? p.Age = 10;
??????????? p.Name = "張三";
??????????? p.Gender = '男';
??????????? p.SayHello();
?
??????????? person p2=new person();
??????????? p2.Name = "李四";
??????????? p2.Age = 88;
??????????? p2.Gender ='女';
??????????? p2.SayHello();
?
??????? }
??? }
}
靜態(tài)和非靜態(tài)的區(qū)別-面向?qū)ο蟪跫?jí)
1,非靜態(tài)類中,既可以有實(shí)列成員,也可以有靜態(tài)成員
2在調(diào)用實(shí)例成員的時(shí)候,需要使用對(duì)象名,實(shí)例成員
在調(diào)用靜態(tài)成員的時(shí)候,需要使用類名.靜態(tài)成員名
4,? 靜態(tài)成員必須使用類名去調(diào)用,而實(shí)例成員使用對(duì)象名去調(diào)用
靜態(tài):
?private static string _name;
?public static string Name
?{
????? get { return Person._name; } 2
????? set { Person._name = value; }
?}
非靜態(tài)
private char _gender;
public char Gender
{
get { return _gender; }
set { _gender = value; }
}
5,靜態(tài)函數(shù)中,只能訪問靜態(tài)成員,不允許訪問實(shí)例成員。
6,實(shí)例函數(shù)中,既可以使用靜態(tài)成員,也可以使用實(shí)例成員
7,靜態(tài)類中只允許有靜態(tài)成員,不允許出現(xiàn)實(shí)列成員
?
使用:
1, 如果你想要你的類當(dāng)作一個(gè)“工具類”去使用,這個(gè)時(shí)候可以考慮將類寫成靜態(tài)類
工具類:典型CONSOLE類,經(jīng)常會(huì)用到的東西寫成一個(gè)類就是工具類
2, 靜態(tài)類在整個(gè)項(xiàng)目中資源共享
構(gòu)造函數(shù)
作用幫助我們初始化對(duì)象(給對(duì)象的每個(gè)屬性一次的賦值)
構(gòu)造函數(shù)是一個(gè)特殊的方法
1, 構(gòu)造函數(shù)沒有返回值,連void也不能寫
2, 構(gòu)造函數(shù)名稱必須跟類名一樣
類當(dāng)中會(huì)有一個(gè)默認(rèn)的無參數(shù)的構(gòu)造函數(shù),當(dāng)你寫一個(gè)新的構(gòu)造函數(shù)之后,不管是有參數(shù)的或是無參數(shù)的,那個(gè)默認(rèn)的無參數(shù)的構(gòu)造函數(shù)都被干掉了。
創(chuàng)建對(duì)象的時(shí)候會(huì)執(zhí)行構(gòu)造函數(shù)
?
3, new關(guān)鍵字
Person zsPerson=new Person();
1,在內(nèi)存中開辟一塊內(nèi)存
2,在開辟的空間中創(chuàng)建對(duì)象
4, 調(diào)用對(duì)象的構(gòu)造函數(shù)進(jìn)行初始化對(duì)象
類:
public Student (string name,int age,char gender,int chinese,int math,int english)
??????? {
??????????? this .Name = name;
??????????? this.Age = age;
??????????? this.Gender = gender;
??????????? this.Chinese = chinese;
??????????? this.Math = math;
??????????? this.English = english;
??????? }
??????? private string _name;
??????? public string Name
??????? {
??????????? get { return _name; }
??????????? set { _name = value; }
??????? }
?
??????? private int _age;
?
??????? public int Age
??????? {
??????????? get { return _age; }
??????????? set
??????????? {
??????????????? if (value < 0 || value > 100)
??????????????? {
??????????????????? value = 0;
??????????????? }
?
??????????????? _age = value;
??????????? }
??????? }
??????? private char _gender;
??????? public char Gender
??????? {
??????????? get
??????????? {
??????????????? if (_gender != '男' && _gender != '女')
??????????????? {
??????????????????? return _gender = '男';
??????????????? }
?
??????????????? return _gender;
??????????? }
??????????? set { _gender = value; }
??????? }
??????? private int _chinese;
??????? public int Chinese
??????? {
??????????? get { return _chinese; }
??????????? set { _chinese = value; }
??????? }
??????? private int _math;
??????? public int Math
??????? {
??????????? get { return _math; }
??????????? set { _math = value; }
??????? }
?
??????? private int _english;
?
??????? public int English
??????? {
??????????? get { return _math; }
??????????? set { _math = value; }
??????? }
?
??????? public void SayHello()
??????? {
??????????? Console.WriteLine("我叫{0},我今年{1}歲了,我是{2}生", this.Name, this.Age, this.Gender);
??????? }
?
??????? public void ShowScore()
??????? {
??????????? Console.WriteLine("我叫{0},我的總成績是{1},平均分是{2}", this.Name, this.Chinese + this.English + this.Math, (this.Chinese + this.English + this.Math) / 3);
??????? }
Main函數(shù)
Student zsStudent=new Student("張三", '男', 100, 100, 100);
?
zsStudent.SayHello();
zsStudent.ShowScore();
?
Student xlStudent = new Student("小蘭",16,'女',50,50,50);
?
xlStudent.ShowScore();
xlStudent.SayHello();
?
this
1,? 代表當(dāng)前類的對(duì)象
2,? 在類中顯示的調(diào)用本類的構(gòu)造函數(shù) :this()
析構(gòu)函數(shù)
當(dāng)程序結(jié)束時(shí),析構(gòu)函數(shù)執(zhí)行,幫助我們釋放資源
語法
~ 類名()
{
??????
}
~ student()
{
??????
}
命名空間
可以認(rèn)為類是屬于命名空間的
如果在當(dāng)前項(xiàng)目中沒有這個(gè)類的命名空間,需要我們手動(dòng)導(dǎo)入這個(gè)類所在的命名空間
一
1),用鼠標(biāo)去點(diǎn)
2),alt+shift+F10
3),記住命名空間,手動(dòng)引用
?
二,在一個(gè)項(xiàng)目中去引用另一個(gè)項(xiàng)目的類
1,? 添加引用 Using 類名;
2,? 引用命名空間
值類型和引用類型
區(qū)別
1,? 值類型和引用類型你在內(nèi)存上存儲(chǔ)的地方不一樣
2,? 在傳遞值類型和傳遞引用類型的時(shí)候,傳遞的方法不一樣
值類型我們稱之為值傳遞,引用類型我們稱之為引用傳遞
值類型:int,double,bool,char,decimal,struct,enum
引用類型:string,自定義類
值類型的值是存儲(chǔ)在內(nèi)存的棧中
引用類型存儲(chǔ)在內(nèi)存的堆中
字符串的不可變性
1,當(dāng)你給一個(gè)字符串重新賦值后,老值并沒有銷毀,而是重新開辟一塊空間存儲(chǔ)
當(dāng)程序結(jié)束后,GC(垃圾內(nèi)存回收器)掃描整個(gè)內(nèi)存,如果發(fā)現(xiàn)有的空間沒有被只想,則立即把他銷毀
?
3,? 我們可以將字符串看作是char類型的一個(gè)只讀(只能讀取不能更改)數(shù)組,既然可以將string看作char類的只讀數(shù)組,所以我可通過下表去訪問字符串中的摸一個(gè)元素
4,? 字符串提供的個(gè)種方法
1)length:獲得當(dāng)前字符串中字符的個(gè)數(shù)
2,ToUpper():將字符串轉(zhuǎn)換為大寫形式
3),ToLower():將字符串轉(zhuǎn)換為小寫形式,
4),Equals(lesstwo,StringComparison.CurrentCultureIgnoreCase):比較兩個(gè)字符串是否相同,忽略大小寫
5),Split():分割字符串沒返回字符串類型的數(shù)組
6),Substring():解決字符串,在截取的時(shí)候包含要截取的那個(gè)位置。????
7),IndexOf():判斷某個(gè)字符串在字符串中第一次出現(xiàn)的位置,若沒有返回一個(gè)-1
8),LastIndexOf():判斷某個(gè)字符串在字符串中最后一次出現(xiàn)的位置,如果沒有返回-1
9),StartWith():判斷以什么 什么開始
10),EndsWith():判斷以什么 什么結(jié)束
11),Replace():判斷字符串中是否包含指定的字符串
12),Contains():判斷某個(gè)字符串是否包含指定的字符串
13),Trim():去掉字符串中的前后的空格
14),TrimEnd():去掉字符串中結(jié)尾的空格
15),TrimStart():去掉字符串中前面的空格
16),IsNullOrEmpty():判斷一個(gè)字符串是否為空或者位null
17),String.Join():將數(shù)組按照指定的字符串連接,返回一個(gè)字符串
練習(xí):
Console.WriteLine("請(qǐng)輸入你喜歡的課程");
string lessone = Console.ReadLine();
//lessone = lessone.ToUpper();
Console.WriteLine("請(qǐng)輸入你喜歡的課程");
string lesstwo=Console .ReadLine();
//lesstwo = lesstwo.ToUpper();
if (lessone.Equals (lesstwo,StringComparison.CurrentCultureIgnoreCase))
{
Console.WriteLine("你們倆喜歡的課程相同");
}
else
{
Console .WriteLine("你們倆喜歡的課程不同");
?
}
Console.ReadKey();
string s = "abcdefg";
Console.WriteLine(s[0]);
Console .ReadKey ();
5),Split()分割字符串,返回字符串類型的數(shù)組
?
?
5, 如果要改變數(shù)組,首先將字符串轉(zhuǎn)換為char類型的數(shù)組
char[] chs = s.ToCharArray();
chs[0] = 'b';
TO轉(zhuǎn)向,char類型,Array數(shù)組
將字符數(shù)轉(zhuǎn)換位我們的字符串
s = new string (chs)能夠?qū)har數(shù)組轉(zhuǎn)換為字符串
String Bulider(內(nèi)存垃圾回收器,優(yōu)化程序運(yùn)行速度)
StringBuilder sb= new StringBuilder();
String str = null;//null是空的意思
Stopwatch sw = new Stopwatch();
//創(chuàng)建一個(gè)計(jì)時(shí)器
sw.Start();
for (int i = 0; i < 10; i++)
{
//str += i;
sb.Append(i);
}
sw.Stop();
Console.WriteLine(sw.Elapsed);
Console.ReadKey();
繼承
我們可能會(huì)在一些類中,寫一些重復(fù)的成員,我們可以將這些重復(fù)的成員。
單獨(dú)的封裝到一個(gè)類中,作為這些類的父類
Student,teacher,Drive,子類 派生類
Person????????????????? 父類 基類
子類繼承了父類,那么子類從父類那里繼承過來了什么?
子類能訪問到的屬性和方法,但是子類并沒繼承父類的私有字段
子類沒有 繼承 父類的構(gòu)造函數(shù),但是,子類會(huì)默認(rèn)調(diào)用父類無參數(shù)的·構(gòu)造函數(shù)。
創(chuàng)建 父類 對(duì)象,讓子類可以使用父類中的成員。
所以,如果在父類中重現(xiàn)寫了一個(gè)有參數(shù)的構(gòu)造函數(shù)之后,那個(gè)無參數(shù)的具備干掉了。
子類調(diào)用不到了,所以子類會(huì)報(bào)錯(cuò)
解決方法
1),在父類中重新寫一個(gè)無參數(shù)的構(gòu)造函數(shù)
2),在子類中顯示的調(diào)用 父類 的構(gòu)造函數(shù)函數(shù),使用關(guān)鍵字 :base():
繼承的特性
1,? 繼承的單根性,一個(gè)子類只能有一個(gè)父類
2,? 傳遞性
3,? 子類沒有繼承構(gòu)造函數(shù)
?
Object是所有類的基類
NEW關(guān)鍵字
1,? 創(chuàng)建對(duì)象
2,? 隱藏從父類那里繼承過來的同名成員 隱藏的后果就是子類調(diào)用不到父類的成
里氏轉(zhuǎn)換
1,? 子類可以賦值給父類,如果有一個(gè)地方血藥一個(gè)父類作為參數(shù),我們可以給一個(gè)子類代替
2,? 如果父類重裝的是子類對(duì)象,那么可以將個(gè)父類強(qiáng)轉(zhuǎn)為子類
?
子類對(duì)象可以調(diào)用父類中的成員,但是父類對(duì)象永遠(yuǎn)都之呢個(gè)調(diào)用自己的成員
Is:表示類型轉(zhuǎn)換,如果能夠轉(zhuǎn)換成功,則返回一個(gè)true,否則返回一個(gè)false
as:表示類型轉(zhuǎn)換,如果能夠轉(zhuǎn)換則返回對(duì)應(yīng)的對(duì)象,都則返回一個(gè)null
ArrayList集合
集合,有很多數(shù)據(jù)的一個(gè)集合
集合的好處:長度可以任意改變,類型隨便
ArrayList list = new ArrayList();
list.Add(1);
list.Add(3.14);
list.Add(true);
list.Add("張三");
list.Add('男');
list.Add(5000m);
list.Add(new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 });
Perosn p = new Perosn();
list.Add(p);
list.Add(list);
?
list .AddRange ();可以直接輸出數(shù)組,集合
list.Clear();清空所有元素
list.Remove(true);刪除單個(gè)元素
list.RemoveAt(0);根據(jù)下標(biāo)刪除元素
list.RemoveRange(0,3);根據(jù)下標(biāo)刪除一定范圍的元素
list.Sort();升序排列
list.Reverse();反轉(zhuǎn)
list.insert(1,”插入的”);在指定的位置插入一個(gè)元素
list.InsertRange(0,new string []”張三”,“李四“});在指定的位置插入一個(gè)集合
bool b =list.Contains(1);判斷是某個(gè)指定的元素
?
ArrayList集合的長度問題
每次集合中實(shí)際包含的元素個(gè)數(shù)(count超過了可以包含的元素的個(gè)數(shù)(capcity)的時(shí)候
集合就會(huì)像內(nèi)存中盛情多開辟已被的控件,來保證集合的長度一直夠用。
List泛型集合
List <int > list=new List<int>();
list.Add(1);
list.Add(2);
list.Add(3);
list.AddRange(new int[] { 1, 2, 3, 4, 5, 6, });
list.AddRange(list);
int [] nums=list.ToArray();
for (int i = 0; i < list .Count ; i++)
{
Console.WriteLine(list[i]);
?
}
Console.ReadKey();
Foreach循環(huán)
foreach (var item in collection)
{
?
}
Var:推斷集合中項(xiàng)的類型
Item:集合中的每一項(xiàng)
In:在什么里
Collection:集合
Hastable鍵值對(duì)集合
在鍵值對(duì)集合當(dāng)中,我們是根據(jù)鍵去找值的。
鍵值對(duì)對(duì)象[鍵]=值
****鍵值對(duì)集合當(dāng)中,鍵必須是唯一的,而值是可以重復(fù)的
Hashtable ht=new Hashtable();
ht.Add(1, "張三");
ht.Add(2, true);
ht.Add(3, '男');
ht.Add(false, "錯(cuò)誤的");
ht[6]= "新來的";
?
?
Dictionary字典集合
Dictionary <int ,string >dic=new Dictionary<int ,string>();
dic.Add(1, "張三");
dic.Add(2, "李四");
dic.Add(3, "王五");
dic[1] = "新來的";
foreach (KeyValuePair <int ,string >kv in dic )
{
Console.WriteLine("{0}---{1}",kv.Key, kv.Value);
}
foreach (var item in dic .Keys )
{
Console.WriteLine("{0}----{1}", item, dic[item]);
}
Console.ReadKey();
Path類
string str = @"C:\3000soft\Red Spider\Data\Message\老趙 . wav";
//獲得文件名
Console.Writeline(Path.GetFileName(str));
// 獲得文件名但是不包含擴(kuò)展名
Console.WriteLine(Path.GetF ileNameWithoutExtension(str));
//獲得文件的擴(kuò)展名
Console.Writeline(Path.GetExtension(str));
//獲得文件所在的文件夾的名稱
Console.WriteL ine(Path.GetDirectoryName(str));
//獲得文件所在的全路徑
Console.WriteLine(Path.GetFullPath(str));
//連接兩個(gè)字符串作為路圣
Console.WriteLine(Path.Combine(@"c:\a\","b.txt"));
File類
絕對(duì)路徑:通過給定的這個(gè)路徑直接能在我的電腦中找到這個(gè)文件
相對(duì)路徑:文件相對(duì)于應(yīng)用程序的路徑
絕對(duì)路徑:string str = File.ReadAllText(@"E:\qwer.txt");
相對(duì)路徑:string str = File.ReadAllText("Ewer.txt");
開發(fā)中使用相對(duì)路徑
?
1,創(chuàng)建文件
File.Create(@"E:\new.mp4");
Console.WriteLine("創(chuàng)建成功");
Console.ReadKey();
2,刪除文件
File.Delete(@"E:\new.mp4");
Console.WriteLine("刪除成功");
Console.ReadKey();
3,復(fù)制文件
File.Copy(@"E:\大自然.MP4",@"E:\A");
Console.WriteLine("復(fù)制成功");
Console.ReadKey();
4,判斷文件是否存在
bool b = File.Exists(@"E:\大自然.mp4");
Console.WriteLine(b);
Console.ReadKey();
5,剪切
File.Move(@"E:\大自然.mp4", @"E:\A");
Console.WriteLine("剪切成功");
Console.ReadKey();
6, 讀取文件信息
讀取字節(jié)(讀取音樂圖像視頻這些文件用這個(gè))
byte[] buffer = File.ReadAllBytes(@"E:\qwer.txt");
Encoding采取編碼讀取方式 Default自己選找編碼格式 GetString獲得字符串
string str = System.Text.Encoding.Default.GetString(buffer);
Console.WriteLine(str);
Console.ReadKey();
數(shù)組一行一行的讀取(精確的操縱每一行數(shù)據(jù))
string[] str = File.ReadAllLines(@"E:\qwer.txt",Encoding.Default );
for (int i = 0; i < str.Length; i++)
{
Console.WriteLine(str[i]);
}
Console.ReadKey();
String形式讀取
string str = File.ReadAllText(@"E:\qwer.txt",Encoding.Default);
Console.WriteLine(str);
Console.ReadKey();
寫入
以字符串?dāng)?shù)組形勢(shì)寫入信息
File.WriteAllLines(@"E:\qwer.txt", new string[] { "bpmof", "detenele" });
Console.WriteLine("OK");
Console.ReadKey();
字符串形勢(shì)寫入
File.WriteAllText(@"E:\qwer.txt", "張三李四王五");
Console.WriteLine("OK");
Console.ReadKey();
不覆蓋寫入
File.AppendAllText(@"E:\qwer.txt", "輸入滾動(dòng)發(fā)");
裝箱和拆箱
裝箱:將值類型轉(zhuǎn)換為引用類型
拆箱:將引用類型轉(zhuǎn)換為值類型
看兩種類型是否發(fā)生了裝箱和拆箱,要看這兩種而類型是否發(fā)生了繼承關(guān)系
裝箱
int n = 10;
object o = n;//裝箱
拆箱
int nn = (int)o;
文件流 FileStream? StreamReader和StreamWrite
文件流和File最大的不同是一點(diǎn)一點(diǎn)的讀取文件,適用于大型文件
FileStream:操作字節(jié)
StreamReader和StreamWrite操作字符的
FileStream怎么用
將創(chuàng)建文件流對(duì)象的過程寫在using當(dāng)中,會(huì)自動(dòng)的幫助我們釋放流所占用的資源
using()
{
??????
}
讀取數(shù)據(jù)
創(chuàng)建文件流
傳參需要三個(gè)參數(shù):1,文件路徑2,針對(duì)這個(gè)文件做什么操作3,對(duì)數(shù)據(jù)進(jìn)行操作
Filemode指定操作系統(tǒng)打開文件的方式(枚舉類型)
調(diào)用OpenOrCreate有打開沒有就創(chuàng)建
FileStream fsRead = new FileStream(@"E:\sss.txt", FileMode.OpenOrCreate, FileAccess.Read);
創(chuàng)建一個(gè)字節(jié)數(shù)組來限定每次讀多少1024KB*1024KB*5=5MB
byte[] buffer = new byte[1024*1024*5];
返回int類型來接收=讓這個(gè)對(duì)象去讀取(字節(jié)數(shù)組限定每次讀取的數(shù)組,0最開始讀數(shù)據(jù),最多讀5MB)
返回本次實(shí)際讀取到的有效字節(jié)數(shù)
int r = fsRead.Read(buffer, 0, buffer.Length);
將字節(jié)數(shù)組中每一個(gè)元素讀取按照指定的編碼格式解碼成字符串Encoding編碼,Default是自己選擇編碼格式
string s =Encoding.Default.GetString(buffer,0,r);
關(guān)閉流
fsRead.Close();
釋放流所占用的資源
fsRead.Dispose();
Console.WriteLine(s);
Console.ReadKey();
寫入數(shù)據(jù)
using(FileStream fsWrirte=new FileStream(@"E:\abc.txt",FileMode.OpenOrCreate,FileAccess.Write ))
{
string str = "我叫鹿共禾";
byte[] buffer = Encoding.Default.GetBytes(str);
fsWrirte.Write(buffer, 0, buffer.Length);
}
Console.WriteLine("創(chuàng)建成功");
Console.ReadKey();
復(fù)制多媒體文件
static void Main(string[] args)
{
//思路:就是將復(fù)制的多媒體文件讀出來,然后再寫入到你指定的位置
string source = @"E:\sss.mp4";
string target = @"E:\asb";
CopyFile(source, target);
Console .WriteLine ("成功");
Console.ReadKey();
}
public static void CopyFile(string source,string target)
{
//創(chuàng)建一個(gè)負(fù)責(zé)讀取的流
using (FileStream fsRead =new FileStream (source ,FileMode.Open,FileAccess.Read))
{
//創(chuàng)建一個(gè)負(fù)責(zé)寫入的流
using (FileStream fsWrite = new FileStream (target ,FileMode.OpenOrCreate,FileAccess.Write ))
{
//字節(jié)數(shù)組限定一次讀取5mb
byte[] buffer = new byte[1024 * 1024 * 5];
//因?yàn)槲募赡鼙容^大,所以我們?cè)谧x取的時(shí)候,應(yīng)當(dāng)通過一個(gè)循環(huán)去讀
while (true )
{
//返回本次讀取實(shí)際讀取到的字節(jié)數(shù)
int r = fsRead.Read(buffer, 0, buffer.Length);
//如果返回一個(gè)0,也就意味著什么都沒有讀取到,讀取完了
if (r==0)
{
break;
}
//寫入調(diào)用
fsWrite.Write(buffer, 0, r);
}
}
}
StreamReader
using (StreamReader sr =new StreamReader (@"E:\abc.txt",Encoding .Default ))
{
while (!sr.EndOfStream)
{
Console.WriteLine(sr.ReadLine());
}
?
}
Console.ReadKey();
StreamWrite
using (StreamWriter sw=new StreamWriter (@"E:\abc.txt"))
{
sw.Write("今天天氣好晴朗,處處好風(fēng)光",true);
}
Console.WriteLine("OK");
Console.ReadKey();
多態(tài)
概念:讓一個(gè)對(duì)象能夠表現(xiàn)出多種的狀態(tài)(類型)
實(shí)現(xiàn)多態(tài)有三種
虛方法,抽象,接口
虛方法
步驟
1,? 將父類的方法標(biāo)記成虛方法,使用關(guān)鍵字 virtual,這個(gè)函數(shù)可以被子類重新寫一遍
子類函數(shù)用override
namespace ConsoleApp62
{
??? internal class Program
??? {
??????? static void Main(string[] args)
??????? {
???????????
??????????? Chinese cn1 = new Chinese("韓梅梅");
??????????? Chinese cn2 = new Chinese("李雷");
??????????? Jb j1 = new Jb("田所浩二");
??????????? Jb j2 = new Jb("114514");
??????????? Kb k1 = new Kb("樸珍希");
??????????? Kb k2 = new Kb("金線繡");
??????????? Am A1 = new Am("科比布萊恩特");
??????????? Am A2 = new Am("川建國");
??????????? Person[] pers = { cn1, cn2, j1, j2, k1, k2, A1, A2 };
??????????? for (int i = 0; i < pers.Length; i++)
??????????? {
?
??????????????? pers[i].SayHello? ();
?
??????????? }
??????????? Console.ReadKey ();
??????? }
??? }
??? public class Person
??? {
??????? private string _name;
??????? public string Name
??????? {
??????????? get { return _name; }
??????????? set { _name = value; }
??????? }
??????? public Person(string name)
??????? {
??????????? this.Name = name;
??????? }
??????? public virtual void SayHello()
??????? {
??????????? Console.WriteLine("我是人類");
??????? }
??? }
??? public class Chinese : Person
??? {
??????? public Chinese(string name) : base(name)
??????? {
?
??????? }
??????? public override? void SayHello()
??????? {
??????????? Console.WriteLine("我是中國人,我叫{0}", this.Name);
??????? }
??? }
??? public class Jb : Person
??? {
??????? public Jb(string name) : base(name)
??????? {
?
??????? }
??????? public override? void SayHello()
????? ??{
??????????? Console.WriteLine("我是日本人,我叫{0}", this.Name);
??????? }
??? }
??? public class Kb : Person
??? {
??????? public Kb(string name) : base(name)
??????? {
?
??????? }
??????? public override? void SayHello()
??????? {
??????????? Console.WriteLine("我是韓國人,我叫{0}", this.Name);
??????? }
??? }
??? public class Am : Person
??? {
??????? public Am(string name) : base(name)
??????? {
?
??????? }
??????? public override? void SayHello()
??????? {
??????????? Console.WriteLine("我是美國人,我叫{0}", this.Name);
??????? }
??? }
}
抽象類
當(dāng)父類中的方法不知道如何去實(shí)現(xiàn)的時(shí)候,可以考慮將父類寫成抽象類,將方法寫成抽象方法。
1,抽象成員必須標(biāo)記為abstract,并且不能有任何實(shí)現(xiàn)
2,? 抽象成員必須在抽象類里
3,? 抽象類不能實(shí)例化
4,? 子類繼承抽象類后,必須把父類中的所有抽象成員都重寫。(除非子類也是抽象類)
5,? 可以包含實(shí)例成員
6,? 抽象類有構(gòu)造函數(shù),但是不能被實(shí)例化
7、如果父類的抽象方法中有參數(shù),那么。繼承這個(gè)抽象父類的子類在重寫父類的方法的時(shí)候必須傳入對(duì)應(yīng)的參數(shù)。如果抽象父類的抽象方法中有返回值,那么子類在重寫這個(gè)抽象方法的時(shí)候也必須要傳入返回值。
8,如果父類中的方法有默認(rèn)的實(shí)現(xiàn),并且父類需要被實(shí)例化,這時(shí)可以考慮將父類定義成一個(gè)普通類,用虛方法來實(shí)現(xiàn)多態(tài)。如果父類中的方法沒有默認(rèn)實(shí)現(xiàn),父類也不需要被實(shí)例化,則可以將該類定義為抽象類。
namespace ConsoleApp2
{
??? internal class Program
??? {
??????? static void Main(string[] args)
??????? {
??????????? MoblieStorage ms = new Udisk();
??????????? coumputer cpu = new coumputer();
??????????? cpu.CPUWrite(ms);
??????????? cpu.CPURead(ms);
??????????? Console.ReadKey();
??????? }
??? }
??? /// <summary>
??? /// 抽象的父類
??? /// </summary>
??? public abstract class MoblieStorage
??? {
??????? public abstract void Read();
??????? public abstract void Wite();
??? }
??? public class MobliedISK : MoblieStorage
??? {
??????? public override void Read()
??????? {
??????????? Console.WriteLine("移動(dòng)硬盤在讀取數(shù)據(jù)");
??????? }
?
??????? public override void Wite()
??????? {
??????????? Console.WriteLine("移動(dòng)硬盤再寫入數(shù)據(jù)");
??????? }
??? }
??? public class Udisk : MoblieStorage
??? {
??????? public override void Read()
??????? {
??????????? Console.WriteLine("U盤在讀取數(shù)據(jù)");
??????? }
?
??????? public override void Wite()
??????? {
??????????? Console.WriteLine("U盤在寫入數(shù)據(jù)");
??????? }
??? }
??? public class MP3 : MoblieStorage
??? {
??????? public override void Read()
??????? {
??????????? Console.WriteLine("MP3在讀取數(shù)據(jù)");
??????? }
?
??????? public override void Wite()
??????? {
??????????? Console.WriteLine("MP3在寫入數(shù)據(jù)");
??????? }
??????? public void palyMusic()
??????? {
??????????? Console.WriteLine("播放音樂");
??????? }
??? }
??? public class coumputer
??? {
??????? public void CPURead(MoblieStorage ms)
??????? {
??????????? ms.Read();
??????? }
??????? public void CPUWrite(MoblieStorage ms)
??????? {
??????????? ms.Wite();
??????? }
??? }
}
接口
接口就是一個(gè)規(guī)范能力
接口不允許添加訪問修飾符,默認(rèn)是Public
不允許寫具有方法體的函數(shù)
可以寫自動(dòng)屬性
接口是
一種規(guī)范。
只要一個(gè)類繼承了一個(gè)接口,這個(gè)類就必須實(shí)現(xiàn)這個(gè)接口中所有的成員
能被實(shí)例化。
也就是說,接口的訪問修飾符成員(不能創(chuàng)建對(duì)象)
接口中的成員不能加“訪問修飾符”,接口中的成員訪問修飾符為public,不能修改。
(默認(rèn)為public)接口中的成員不能有任何實(shí)現(xiàn)(“光說不做”,只是定義了一組未實(shí)現(xiàn)的成員)。
接口中只能有方法、屬性、索引器、事件,不能有“字段”和構(gòu)造函數(shù)。
接口與接口之間可以繼承,并且可以多繼承。
接口并不能去繼承一-個(gè)類, 而類可以繼承接口 (接口只能繼承于接口,而類既可以繼承接口,也可以繼承類)
實(shí)現(xiàn)接口的子類必須實(shí)現(xiàn)該接口的全部成員。
- -個(gè)類可以同時(shí)繼承-一個(gè)類并實(shí)現(xiàn)多口,如果-個(gè)子類同時(shí)繼承了父類A,并實(shí)現(xiàn)了接口IA,那么語法上A必須寫在IA的前面。
class IyClass:A, IA0,因?yàn)轭愂菃卫^承的。
顯示實(shí)現(xiàn)接口的縣的。解決方法的重名問題
在么時(shí)候顯示的丟實(shí)現(xiàn)接口:
當(dāng)繼承的倍口中的方法和參數(shù)-摸-樣的時(shí)候,要是用顯示的實(shí)現(xiàn)接口
當(dāng)-個(gè)抽象類實(shí)現(xiàn)接口的時(shí)候,需要子類去實(shí)現(xiàn)接口。
Public interface I…able
{
??? 成員;方法和屬性,索引器
}
訪問修飾符
1,能夠修飾類的訪問修飾符只有兩個(gè):public,internal
2,可訪問性不一致
子類的訪問權(quán)限不能高于父類的訪問權(quán)限,會(huì)暴露父類的訪問權(quán)限
?
簡單工廠設(shè)計(jì)模式
設(shè)計(jì)模式:設(shè)計(jì)這個(gè)項(xiàng)目的一種方式
namespace 訪問修飾符
{
??? internal class Program
??? {
??????? static void Main(string[] args)
??????? {
??????????? Console.WriteLine("輸入你要的筆記本品牌");
??????????? string User = Console.ReadLine();
??????????? NoteBook nb = GetNoteBook(User);
??????????? nb.SayHello();
??????????? Console.ReadKey();
?
??????? }
??????? /// <summary>
??????? /// 簡單工廠核心根據(jù)用戶的輸入創(chuàng)建對(duì)象復(fù)制給父類
??????? /// </summary>
??????? /// <param name="user"></param>
??????? /// <returns></returns>
??????? public static NoteBook GetNoteBook (string user)
??????? {
??????????? NoteBook nb = null;
??????????? switch (user )
??????????? {
??????????????? case "lenovo":nb = new lenovo ();
??????????????????? break;
??????????????? case "IBM":nb = new IBM();
??????????????????? break;
??????????????? case "Acer":nb = new Acer();
??????????????????? break;
??????????????? case "Dell":nb = new Dell();
??????????????????? break;
??????????? }
?
?
??????????? return nb;
??????? }
??? }
??? public abstract class NoteBook
??? {
??????? public abstract void SayHello();
??? }
??? public class lenovo:NoteBook
??? {
??????? public override void SayHello()
??????? {
??????????? Console.WriteLine("我是聯(lián)想筆記本");
??????? }
??? }
??? public class Acer : NoteBook
??? {
??????? public override void SayHello()
??????? {
??????????? Console.WriteLine("我是宏基筆記本");
??????? }
??? }
??? public class Dell : NoteBook
??? {
??????? public override void SayHello()
??????? {
??????????? Console.WriteLine("我是戴爾筆記本");
??????? }
??? }
??? public class IBM : NoteBook
??? {
??????? public override void SayHello()
??????? {
??????????? Console.WriteLine("我是IBM筆記本");
??????? }
??? }
}
值傳遞和引用傳遞
值類型在復(fù)制的時(shí)候,傳遞的是這個(gè)值的本身
引用類型在復(fù)制的時(shí)候,傳遞的是對(duì)這個(gè)對(duì)象的引用
序列化和反序列化
序列化:就是將對(duì)象轉(zhuǎn)換為二進(jìn)制
反序列化:就是將二進(jìn)制轉(zhuǎn)換為對(duì)象
作用:傳輸數(shù)據(jù)
把這類標(biāo)記為序列化[Serializable]
反序列化:
person p;
using (FileStream fsRead = new FileStream(@"E:\aaaa.txr", FileMode.OpenOrCreate, FileAccess.Read))
{
BinaryReader br = new BinaryReader();
p = (person)br.Deserialize (fsRead );
}
Console.WriteLine("反序列化成功");
Console.ReadKey();
序列化
person p = new person();
p.Name = "張三";
p.Age = 19;
p.Gender = '男';
using (FileStream fsWrite=new FileStream (@"E:\aaaa.txr",FileMode.OpenOrCreate,FileAccess.Write ))
{
BinaryReader br = new BinaryReader ();
br.Serialize(fsWrite, p);
}
Console.WriteLine("序列化成功");
Console.ReadKey();
部分類和密封類
部分類:解決名字重復(fù)問題使用partial,兩個(gè)或多個(gè)類組成一個(gè)類?
public partial class Person
密封類:使用關(guān)鍵字sealed,,不能夠被繼承