c#初体验
虚方法、抽象类、接口区别:虚方法:父类可能需要实例化,父类方法需要方法体,可以找到一个父类
抽象类:抽象方法,父类不能实例化,且父类方法不能实现方法体,不可以找出一个父类,需要抽象
接口:多继承
length:是指所有维度的长度
count:是指一维的长度
字符串具有不可变性,虽然是引用类型,但分配的是两个空间
字典和hashtable的区别是字典要指定键值对的类型
类的默认:internal 方法,属性,字段默认private
filestream的write是覆盖掉开头的长度,file stream是全部覆盖
c#方法(1):成员访问修饰符 返回值 方法名称(参数)
{//方法的内容}
类的i为2,共享静态变量,类的实例中有副本故为1
Main中不能直接访问非静态变量static,可通过类的实例调用
在c#中不允许类的实例调用类的静态函数public static int i成员
方法(2):
方法的参数传递机制 :值参数value Parameter 引用参数Rference Parameter 输出参数Output Parameter
类的构造1:
构造器的名称跟类型相同,构造器没有返回值即类型为void
局部变量必须初始化赋值,而类的成员变量无须
类被实例化得时候会自动执行构造器里面的内容
如果没有初始化类的成员变量,在类被实例化之后,类的成员变量会被清零即int 为0 string为空
类的构造2:
B继承A,类A如果有参数构造器就不会再自动生成无参构造器,故一般编程要写一个带参构造器都要有一个无参构造器
执行特定A的构造器可以用base
类的析构3:
类型转换
check
可能发生溢出cheched
uncheck
允许溢出unchecked
**************************************************
新
程序集就是项目
c#对大小写敏感
*****************************************************
1.命名空间
数组1
简化数组 int [] arr={1,2,3};
0代表逗号后面第一个变量,1代表逗号后面第二个变量
new一个外面类,然后调用类中的方法
数组2
命名空间
using System;
namespace CG
{
class test
{
static void Main()
{
A.A1.PrintName a = new A.A1.PrintName();
A.A2.PrintName b = new A.A2.PrintName();
a.intro();
b.intro();
Console.ReadKey();
}
}
namespace A
{
namespace A1
{
public class PrintName
{
public void intro()
{
Console.WriteLine("my name is a1");
}
}
}
namespace A2
{
public class PrintName
{
public void intro()
{
Console.WriteLine("my name is a2");
}
}
}
}
}
方法2
using System;
class Method
{
public static void VMethod(int i = 0)
{
i++;
}
public static void RMethod(ref int i)
{
i++;
}
public static void OMethod(out int i)
{
i = 9;
i++;
}
static void Main()
{
int i = 0;
VMethod(i);
Console.WriteLine("i="+i);
int j=0;
RMethod(ref j);
Console.WriteLine("j=" + j);
int k=0;
OMethod(out k);
Console.WriteLine("k=" + k);
Console.ReadKey();
}
}
使用out必须在方法内部将其初始化,使用ref必须在方法之前也就是main中声明
ref(传递地址,类似指针)和out效果一样
params可变数量关键字(后面常加数组)
using System;
class Method
{
static int addi(params int[] values)
{
int sum = 0;
foreach (int i in values)
sum += i;
return sum;
}
static void Main()
{
Console.WriteLine(addi(1,2,3));
Console.ReadKey();
}
}
数组相当于一个引用类型参数
C#的值类型包括:结构体(数值类型,bool型,用户定义的结构体),枚举,可空类型。
C#的引用类型包括:数组,用户定义的类、接口、委托,object,字符串。
using System;
class test
{
static void PrintfArr(int[] arr)
{
for (int i = 0; i < arr.Length; i++)
{
arr[i] = i;
}
}
static void Main()
{
int[] arr = { 100, 200, 300, 400 };
PrintfArr(arr);
foreach (int i in arr)
Console.Write(i + ",");Console.ReadKey();
}
}
string对象虽然是引用类型参数,但是它不可变,所以在方法里新建一个副本
字符:
{0,3}打印第一个字符,右对齐(空间为3)
C#中英文和中文占两个字节
类class
类的构造
类默认继承object类调用base函数
构造器没有返回值,构造器名称必须和类名相同,构造器是一种特殊的方法
类的实例化如果没有赋值给变量,默认int类为0,string类为空
using System;
class A
{
public string s;
public int i;
}
class test
{
static void Main()
{
A a = new A();
Console.WriteLine("{0}:{1}", a.s, a.i);
Console.ReadKey();
}
}
this指的并不是类本身,而是类实例化以后产生的对象
using System;
class A
{ public int i;
public string s;
public A()
{
}
public A(int i)
{
this.i = i;
}
public A(string s)
{
this.s= s;
}
public A(int i,string s)
{
this.i = i;
this.s = s;
}
}
class test
{
static void Main()
{
A a=new A();
Console.WriteLine(a.i);
Console.WriteLine(a.s);
A b = new A(1);
Console.WriteLine(b.i);
Console.WriteLine(b.s);
A c = new A("s");
Console.WriteLine(c.i);
Console.WriteLine(c.s);
A d = new A(1,"s");
Console.WriteLine(d.i);
Console.WriteLine(d.s);
Console.ReadKey();
}
}
解决雍余
使用本无参构造器用this关键字
using System;
namespace CG
{
class A
{
public A()
{
Console.WriteLine("22");
}
}
class B:A
{
public B()
{
Console.WriteLine("11");
}
}
class test
{
static void Main()
{
B bb=new B();
Console.ReadKey();
}
}
}
类b继承类a,必须调用类A的无参构造器
要是类A有被加有参构造器,那么就不会自动生成无参构造器
要写带参构造器就一定要写无参构造器
using System;
namespace CG
{
class A
{
public A()
{
Console.WriteLine("我是类A的无参构造器");
}
}
class B : A
{
public B()
{
Console.WriteLine("我是类B的无参构造器");
}
}
class test
{
static void Main()
{
B b = new B();
Console.ReadKey();
}
}
}
using System;
namespace CG
{
class A
{
public A()
{
Console.WriteLine("我是类A的无参构造器");
}
public A(int i)
{
Console.WriteLine("我是类A的有参构造器");
}
}
class B : A
{
public B()
{
Console.WriteLine("我是类B的无参构造器");
}
public B(int i):base(i)
{
Console.WriteLine("我是类B的有参构造器");
}
}
class test
{
static void Main()
{
B b = new B(4);
Console.ReadKey();
}
}
}
在类B中使用指定的构造器使用base关键字
对类A进行加载之前时,static静态类也被默认加载
实例化类的时候,static类只执行一次
类的析构:值类型在堆栈超出范围就被清理,而引用类型等待托管堆等待被清理
垃圾回收机制
using System;
class A
{
public A()
{
Console.WriteLine("Creating A");
}
~A()
{
Console.WriteLine("Destroying A");
}
}
class test
{
static void Main()
{
new A();
GC.Collect();
Console.ReadKey();
}
}
new一个空A以后要等到应用程序被关闭才一起被释放掉
尽量不要用GC
托管资源自己的类永远等待垃圾回收机制的处理,而dispose(boolean disposing)的是 托管资源引用其他非托管资源的类
using System;
public class MyResourse : IDisposable
{
private bool disposed = false;
public void Dispose()
{
Dispose(true);
}
public void Close()
{
Dispose(true);
}
~MyResourse()
{
Dispose(false);
}
private void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
Console.WriteLine("调用所引用对象的dispose()方法");
}
Console.WriteLine("释放类本身所使用的非托管资源");
}
disposed = true;
if (disposing)
{
GC.SuppressFinalize(this);
}
}
}
public class test
{
static void Main()
{
MyResourse mr = new MyResourse();
try
{ Console.WriteLine("调用mr释放资源"); }
finally
{
mr.Dispose();
Console.ReadKey();
}
}
}
简化操作using
类的修饰符
default默认 public公共的 private私有的 internal 内部的 protected保护的 protected internal
2.把入口函数写在另外一个类里(程序集)
子类
程序集内
internal:当父类和子类在同一个程序集的时候可以访问父类的internal成员,而不在同一个程序集的时候不可以访问
而protecteded internal(父类和子类)在不同程序集也可以访问
类型转换
检查溢出
checked语句
using System;
class Fruit
{
}
class Apple : Fruit
{
public int i = 1;
}
class Conversions
{
static void Main()
{
Fruit a = new Apple();
Apple f = (Apple)a;
Console.WriteLine(f.i);
Console.ReadKey();
}
}
属性(简化读取和设置)
value是隐藏参数
属性参数用=传进来,方法用()传进来
using System;
class Person
{
private string Name;
public string name
{
get
{
return Name;
}
set
{
Name = value;
}
}
class test
{
static void Main()
{
Person z = new Person();
z.name="张三";
Console.WriteLine(z.name);
Console.ReadKey();
}
}
}
类的私有字段和属性命名相同在大小写敏感例如vb.net中会出现错误
记录访问修改次数
静态属性和静态字段只能通过类名来访问
索引器(有参属性)
首先声明了一个arrclass类的数组
使用this关键字
public string this 【int index】
返回值是string ,参数是int
using System;
class IndexClass
{
private string [] name=new string [10];
public string this[int index]
{
get { return name[index]; }
set { name[index] = value; }
}
}
class test
{
static void Main()
{
IndexClass b = new IndexClass();
b[0] = "张三";
Console.WriteLine("b[0]="+b[0]);
Console.ReadKey();
}
}
索引器这里只需要new一个实例,而数组类需要new多个
(索引器事务索引值可以为其他)在
hashtable中加值是通过add方法(key,value)
通过值找键 dictionaryEnter寻找
Convert.ToInt32、int.Parse的区别
https://zhidao.baidu.com/question/298960445.html
using System;
using System.Collections;
class IndexClass
{
private Hashtable name = new Hashtable();
public string this[int index]
{
get { return name[index].ToString(); }
set { name.Add(index, value); }
}
public int this[string aname]
{
get
{
foreach (DictionaryEntry d in name)
{
if (d.Value.ToString() == aname)
{
return Convert.ToInt32(d.Key);
}
}
return -1;
}
set { name.Add(value, aname); }
}
}
class test
{
static void Main()
{
IndexClass b = new IndexClass();
b[400] = "张三";
Console.WriteLine(b["张三"]);
Console.ReadKey();
}
}
没有hashtable
using System;
class ArrClass
{
private readonly string name;
public ArrClass(string name)
{
this.name = name;
}
public string Name
{
get{return name;}
}
}
class Indexclass
{
private string [] name= new string[10];
public string this[int index]
{
get { return name[index];}
set{name[index]=value;}
}
}
class test
{
static void Main()
{
ArrClass[] a=new ArrClass[10];
a[0]=new ArrClass("张三");
a[1]=new ArrClass("李四");
a[2]=new ArrClass("王五");
Console.WriteLine("0:"+a[0].Name);
Console.WriteLine("1:"+a[1].Name);
Console.WriteLine("2:"+a[2].Name);
Console.WriteLine("2222222222222:");
Indexclass b=new Indexclass ();
b[0]="张三";
b[1]="张三";
b[2]="张三";
Console.WriteLine("0:"+b[0]);
Console.WriteLine("1:"+b[1]);
Console.WriteLine("2:"+b[2]);
Console.ReadKey();
}
}
有:using System;
using System.Collections;
class IndexClass
{
private Hashtable name = new Hashtable();
public string this[int index]
{
get { return name[index].ToString(); }
set{name.Add(index,value);}
}
public int this[string Name]
{
get
{
foreach (DictionaryEntry d in name)
{
if (d.Value.ToString() == Name)
{
return Convert.ToInt32(d.Key);
}
}
return 8;
}
set { name.Add(value, Name); }
}
}
class test
{
static void Main()
{
IndexClass b = new IndexClass();
b[100]="张三";
Console.WriteLine(b[100]);
Console.WriteLine(b["张三"]);
Console.ReadKey();
}
}
using System;
using System.Collections;
class IndexClass
{
private Hashtable name = new Hashtable();
public string this[int index]
{
get { return name[index].ToString(); }
set { name.Add(index, value); }
}
public int this[string aname]
{
get
{
foreach (DictionaryEntry d in name)
{
if (d.Value.ToString() == aname)
{
return Convert.ToInt32(d.Key);
}
}
return -1;
}
set { name.Add(value, aname); }
}
}
class test
{
static void Main()
{
IndexClass b = new IndexClass();
b[400] = "张三";
Console.WriteLine(b["张三"]);
Console.ReadKey();
}
}
属性的名字可以随便取,而索引器的名称必须是this
new的时候只能用类的实例名
C#中最小的单位是字节byte
委托
using System;
delegate void EatDelegate(string food);
class MyDelegate
{
static void ZsEat(string food)
{
Console.WriteLine("张三吃"+food);
}
static void Main()
{
EatDelegate zs=new EatDelegate(ZsEat);
zs("西瓜");
Console.ReadKey();
}
}
委托链不需要实例化
using System;
delegate void EatDelegate(string food);
class MyDelegate
{
static void ZsEat(string food)
{
Console.WriteLine("张三吃"+food);
}
static void LiSi(string food)
{
Console.WriteLine("李四吃" + food);
}
static void WanWu(string food)
{
Console.WriteLine("王五吃" + food);
}
static void Main()
{
EatDelegate Zs = new EatDelegate(ZsEat);
EatDelegate Ls = new EatDelegate(LiSi);
EatDelegate Wu = new EatDelegate(WanWu);
EatDelegate all;
all = Zs + Ls + Wu;
all("西瓜");
Console.ReadKey();
}
}
像这种只有几句话的委托方法,简化方法
直接把方法写在委托链里面
委托2
using System;
delegate void EatDelegate(string food);
class Man
{
private string name;
public Man(string name)
{
this.name = name;
}
public void eat(string food)
{
Console.WriteLine(name+"吃"+food);
}
}
class Party
{
static void eatTogther(string food, params EatDelegate[] values)
{
if (values == null)
{
Console.WriteLine("座谈会结束");
}
else
{
EatDelegate eatChain = null;
foreach (EatDelegate ed in values)
eatChain += ed;
eatChain(food);
}
}
static void Main()
{
Man ZS = new Man("张三");
Man Ls = new Man("李四");
Man Ww = new Man("王五");
EatDelegate zs = new EatDelegate(ZS.eat);
EatDelegate ls = new EatDelegate(Ls.eat);
EatDelegate Wu = new EatDelegate(Ww.eat);
eatTogther("西瓜",zs,ls, Wu);
Console.ReadKey();
}
}
事件
事件的委托标识符必须和方法一样(即上图中的Publish()要和Receive一致)
事件的本质其实就是一个委托链
using System;
class Publisher
{
public delegate void Publish();
public event Publish OnPublish;
public void issue()
{
if (OnPublish != null)
{
Console.WriteLine("发行刊物");
OnPublish();
}
}
}
class Subscriber
{
public void Receive()
{
Console.WriteLine("订阅者已经收到了刊物");
}
}
class Story
{
static void Main()
{
Publisher Pub = new Publisher();
Subscriber zs = new Subscriber();
Pub.OnPublish += new Publisher.Publish(zs.Receive );
Pub.issue();
Console.ReadKey();
}
}
using System;
class Publisher //出版社
{
public delegate void Publish();//声明事件所需的代理
public event Publish OnPublish;//事件的声明
public void issue()//触发事件的方法
{
if (OnPublish != null)
{
Console.WriteLine("发行刊物");
OnPublish();
}
}
}
class Subscriber//订阅者
{
public void Receive()//定义事件处理程序
{
Console.WriteLine("收到!!!");
}
}
class Story
{
static void Main()
{
Publisher Pub = new Publisher();
Subscriber zs = new Subscriber();
Pub.OnPublish += new Publisher.Publish(zs.Receive);
Pub.issue();
Console.ReadKey();
}
}
事件2
事件拥有返回值也就失去了它的意义,所以事件的委托定义类型为void
方法2还没看懂
虚方法
多态
virtual虚方法 用override重写
当我们用override重写B中的F方法后,就算A.F也是重写后的B.F
using System;
class Employee
{
protected string Name;
public Employee() { }
public Employee(string name)
{
Name = name;
}
public virtual void StartWork()
{
Console.Write(Name+"开始工作");
}
}
class Manager : Employee
{
public Manager(string name) : base(name) { }
public override void StartWork()
{
Console.WriteLine(Name + "给员工下达任务");
}
}
class test
{
static void Main()
{
Employee [] emp=new Employee[2];
emp[0] = new Employee("张三");
emp[1] = new Manager("李四");
foreach (Employee ed in emp)
ed.StartWork();
Console.ReadKey();
}
}
抽象类
抽象类的子类必须实现父类的抽象方法,除非子类也是抽象类,要声明抽象方法,必须使用抽象类,抽象方法不能被声明为私有的
抽象类的抽象属性和方法一样没有方法主体但子类必须实现
using System;
abstract class A
{
public abstract void F();
protected int _x;
public abstract int x
{
get;
set;
}}
class B : A
{
public override void F()
{ }
public override int x
{
get { return _x; }
set { _x = value; }
}
}
class test
{
static void Main()
{
B b=new B();
b.x=4;
Console.WriteLine(b.x);
Console.ReadKey();
}
}
如果子类的用途差不多使用虚方法(包装在基类里),如果子类的用途差异大,则使用抽象方法
接口interface (接口可以理解为一种特殊的抽象类)
在接口内的方法没有主体,一个类如果继承了一个方法,那么必然实现接口内的方法
在接口内声明的方法没有方法的主体,以()结束
using System;
interface DriverLicence
{
void GetLincence();
}
class Teacher : DriverLicence
{
public void GetLincence()
{
Console.WriteLine("获得驾驶执照");
}
}
class test
{
static void Main()
{
Teacher zs = new Teacher();
zs.GetLincence();
Console.ReadKey();
}
}
c#中接口命名必须使用大写I开头
using System;
interface IDriverLicenceB
{
void GetLincence();
}
interface IDriverLicenceA : IDriverLicenceB
{
new void GetLincence();
}
class Student : IDriverLicenceB
{
public void GetLincence()
{
Console.WriteLine("获得驾驶执照");
}
}
class Teacher : IDriverLicenceA
{
public void GetLincence()
{
Console.WriteLine("获得驾驶执照");
}
}
class test
{
static void DriveCar(string name, IDriverLicenceB o)
{
IDriverLicenceB dl = o as IDriverLicenceB;//强制类型转换成接口
if (dl != null)
{
Console.WriteLine(name + "开动了卡车");
}
else
{
Console.WriteLine("没有驾照,不能开车");
}
}
static void DriveBus(string name, IDriverLicenceB o)
{
IDriverLicenceA dl = o as IDriverLicenceA;//强制类型转换成接口
if (dl != null)
{
Console.WriteLine(name + "开动了客车");
}
else
{
Console.WriteLine("没有驾照,不能开车");
}
}
static void Main()
{
Teacher t = new Teacher();
DriveCar("教师", t);
DriveBus("教师", t);
Student s = new Student();
DriveCar("学生", s);
DriveBus("学生", s);
Console.ReadKey();
}
}
为什么使用接口https://blog.csdn.net/alincea/article/details/83503455
方案:调用B接口中GetLincence
1.启用不同名字,但是必须实现这个接口的所有基接口方法
2.
接口完全限定名即在实现方法前面加上接口的名字
完全限定不能通过类名来访问
对类来说是私有的,对接口来说是公有的
接口的多态
接口的多重继承中比较重要的原则:如果B隐藏重写了A中的F()方法,那么任何路径都不能从IBC通往A中的F()方法
访问的是c中的F方法
IComparable接口
对象使用Sort必须实现IComparable接口
为什么使用is不使用as:判断用is,使用用as
_name.CompareTo是string内部的方法
类型(type)
对象就是类的实例
什么时候使用值类型:(结构体)
装箱与拆箱,就是值类型与引用类型的转换
值类型在栈上, 引用类型在堆上操作
不能直接转换成不是装箱前的类型,要间接
注:Console.WriteLine()中应用了string.Concat(object,object,object)这三个参数都会转换成object类型
3次装箱(int转object),1次拆箱(object转int(int是值类型))
简化:输出o可以不用装箱
使用.ToString转变成字符串类型,即应用类型,又节省了一次装箱
这里的i并不用进行装箱
执行了装箱操作
gettype()执行了object中的gettype方法所以要进行装箱操作,若值类型使用tostring(自己也有)则没有进行装箱操作
arraylist.add方法传的参数是object类型的,如果使用值类型参数传进去,则要进行装箱操作
雍余,把结构体装进arraylist里面还有诡异的事情,改进:
perpson找不到
改进
数组里面可以放值类型也可以放引用类型,无需进行装箱和拆箱操作
改进
泛型的使用
T代表类型
c#加深学习
委托
using System;
namespace teat
{
class Program
{
public delegate double daili(double Value);
public class JiSuan
{
public static double Shen2(double value)
{
return value * 2;
}
public static double XiaoShen(double value)
{
return value * value;
}
public static double demol(daili temp,double value)
{
double a = temp(value);
return a;
}
}
static void Main(string[] args)
{
daili daili1 = new daili(JiSuan.XiaoShen);
daili daili2 = JiSuan.Shen2;
Console.WriteLine(JiSuan.demol(daili1,3));
Console.WriteLine(JiSuan.demol(daili2, 3));
Console.ReadKey();
}
}
}
委托的改进
using System;
namespace teat
{
class Program
{
public delegate double daili(double Value);
public class JiSuan
{
public static double Shen2(double value)
{
return value * 2;
}
public static double XiaoShen(double value)
{
return value * value;
}
public static double demol(daili temp,double value)
{
double a = temp(value);
return a;
}
public static double demo2(Func<double, double> temp2, double value)//改进
{
return temp2(value);
}
}
static void Main(string[] args)
{
daili daili1 = new daili(JiSuan.XiaoShen);
daili daili2 = JiSuan.Shen2;
Console.WriteLine(JiSuan.demol(daili1,3));
Console.WriteLine(JiSuan.demol(daili2, 3));
Console.WriteLine(JiSuan.demo2(JiSuan.XiaoShen,3));
Console.ReadKey();
}
}
}
lambda表达式
using System;
namespace lambda表达式
{
class Program
{
static void Main()
{
Func<double, double, double> temp = (double a, double b) => a * b;
Console.WriteLine(temp(2,5));
Console.ReadKey();
}
}
}
拓展方法例子
using System;
namespace 拓展方法例子
{
class Program
{
static void Main()
{
string t = "ceshi";
Console.WriteLine(t.tuozhan("我是参数"));
Console.ReadKey();
}
}
public static class Stu
{
public static string tuozhan(this string a, string para)
{
return a + "为string类型进行拓展" + para;
}
}
}
例外,以下是几个例外的运算符:
①那些返回单个元素或者返回一个数值的运算符,如First或者Count。
②转换运算符:ToArray、ToList、ToDictionary、ToLookUp等等ToXXX方法。
以上这些运算符都会触发LINQ语句立即执行,因为他们的返回值类型不支持延迟加载。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Linq延迟状态终止
{
class Program
{
static void Main(string[] args)
{
List<string> arr = new List<string>() { "abc", "bcd", "eff" };
var linq = (from r in arr where r.StartsWith("b") select r).ToList();//使用了ToList方法已经终止linq的延时,把结果存在linq变量里面去了
Console.WriteLine("one");
foreach (string t in linq)
{
Console.WriteLine(t);
}
arr.AddRange(new string[] { "bbb", "b2" });//这时尽管添加元素,但是之前已经使用ToList方法,不会影响Linq变量的结果了
Console.WriteLine("two");
foreach (string t in linq)
{
Console.WriteLine(t);
}
Console.ReadKey();
}
}
}
作业
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
public class A //个人信息
{
public A(String Name) { name = Name; }
public string name { get; set; }
public int age { get; set; }
public string school { get; set; }
public List<FamilyPerson> family { get; set; }
}
public class FamilyPerson//家庭成员信息
{
public String name { get; set; }
public String relation { get; set; }
public int Age { get; set; }
public String place { get; set; }
public String department { get; set; }
}
class test
{
static void Main()
{
List<FamilyPerson> family = new List<FamilyPerson>();
//第一个人
A zhangsan = new A("张三");
zhangsan.school = "中大";
zhangsan.age = 23;
FamilyPerson zhangsan_dad = new FamilyPerson();
zhangsan_dad.name = "张波";
zhangsan_dad.relation = "爸爸";
zhangsan_dad.Age = 46;
zhangsan_dad.place = "腾讯";
zhangsan_dad.department = "研发";
FamilyPerson zhangsan_mom = new FamilyPerson();
zhangsan_mom.name = "李娜";
zhangsan_mom.relation = "妈妈";
zhangsan_mom.Age = 44;
zhangsan_mom.place = "百度";
zhangsan_mom.department = "销售";
FamilyPerson zhangsan_brothersmall = new FamilyPerson();
zhangsan_brothersmall.name = "张锦";
zhangsan_brothersmall.relation = "弟弟";
zhangsan_brothersmall.Age = 21;
zhangsan_brothersmall.place = "比亚迪";
zhangsan_brothersmall.department = "售后";
FamilyPerson zhangsan_brother = new FamilyPerson();
zhangsan_brother.name = "张浩";
zhangsan_brother.relation = "哥哥";
zhangsan_brother.Age = 25;
zhangsan_brother.place = "华为";
zhangsan_brother.department = "销售";
family.Add(zhangsan_dad);//加入
family.Add(zhangsan_mom);
family.Add(zhangsan_brothersmall);
family.Add(zhangsan_brother);
zhangsan.family = family;
Console.Write(" 姓名:" + zhangsan.name);
Console.Write(" 年龄:" + zhangsan.age);
Console.WriteLine(" 学校:" + zhangsan.school);
Console.Write(" 姓名:" + zhangsan_dad.name);
Console.Write(" 关系:" + zhangsan_dad.relation);
Console.Write(" 年龄:" + zhangsan_dad.Age);
Console.Write(" 单位:" + zhangsan_dad.place);
Console.WriteLine(" 部门:" + zhangsan_dad.department);
Console.Write(" 姓名:" + zhangsan_mom.name);
Console.Write(" 关系:" + zhangsan_mom.relation);
Console.Write(" 年龄:" + zhangsan_mom.Age);
Console.Write(" 单位:" + zhangsan_mom.place);
Console.WriteLine(" 部门:" + zhangsan_mom.department);
Console.Write(" 姓名:" + zhangsan_brothersmall.name);
Console.Write(" 关系:" + zhangsan_brothersmall.relation);
Console.Write(" 年龄:" + zhangsan_brothersmall.Age);
Console.Write(" 单位:" + zhangsan_brothersmall.place);
Console.WriteLine(" 部门:" + zhangsan_brothersmall.department);
Console.Write(" 姓名: " + zhangsan_brother.name);
Console.Write(" 关系:" + zhangsan_brother.relation);
Console.Write(" 年龄: " + zhangsan_brother.Age);
Console.Write(" 单位: " + zhangsan_brother.place);
Console.WriteLine(" 部门: " + zhangsan_brother.department);
//第二个人
A yansi = new A("严四");
yansi.school = "中大";
yansi.age = 23;
FamilyPerson yansi_dad = new FamilyPerson();
yansi_dad.name = "严波";
yansi_dad.relation = "爸爸";
yansi_dad.Age = 46;
yansi_dad.place = "腾讯";
yansi_dad.department = "研发";
FamilyPerson yansi_mom = new FamilyPerson();
yansi_mom.name = "刘娜";
yansi_mom.relation = "妈妈";
yansi_mom.Age = 44;
yansi_mom.place = "百度";
yansi_mom.department = "销售";
Console.Write(" 姓名:" + yansi.name);
Console.Write(" 年龄:" + yansi.age);
Console.WriteLine(" 学校:" + yansi.school);
Console.Write(" 姓名:"+yansi_dad .name);
Console.Write(" 关系:" + yansi_dad.relation);
Console.Write(" 年龄:" + yansi_dad.Age);
Console.Write(" 单位:" + yansi_dad.place);
Console.WriteLine(" 部门:" + yansi_dad.department);
Console.Write(" 姓名:" + yansi_mom.name);
Console.Write(" 关系:" + yansi_mom.relation);
Console.Write(" 年龄:" + yansi_mom.Age);
Console.Write(" 单位:" + yansi_mom.place);
Console.WriteLine(" 部门:" + yansi_mom.department);
//第三个人
A liwu = new A("李五");
liwu.name = "李五";
liwu.school = "仲恺";
liwu.age = 23;
Console.Write(" 姓名:" + liwu.name);
Console.Write(" 年龄:" + liwu.age);
Console.WriteLine(" 学校:" + liwu.school);
FamilyPerson liwu_dad = new FamilyPerson();
liwu_dad.name = "李波";
liwu_dad.relation = "爸爸";
liwu_dad.Age = 46;
liwu_dad.place = "腾讯";
liwu_dad.department = "研发";
Console.Write(" 姓名:" +liwu_dad.name);
Console.Write(" 关系:" + liwu_dad.relation);
Console.Write(" 年龄:" + liwu_dad.Age);
Console.Write(" 单位:" + liwu_dad.place);
Console.WriteLine(" 部门:" + liwu_dad.department);
FamilyPerson liwu_mom = new FamilyPerson();
liwu_mom.name = "陈娜";
liwu_mom.relation = "妈妈";
liwu_mom.Age = 44;
liwu_mom.place = "百度";
liwu_mom.department = "销售";
Console.Write(" 姓名:" + liwu_mom.name);
Console.Write(" 关系:" + liwu_mom.relation);
Console.Write(" 年龄:" + liwu_mom.Age);
Console.Write(" 单位:" + liwu_mom.place);
Console.WriteLine(" 部门:" + liwu_mom.department);
FamilyPerson liqi_yeye= new FamilyPerson();
liqi_yeye.name = "李祺";
liqi_yeye.relation = "爷爷";
liqi_yeye.Age = 66;
liqi_yeye.place = "无";
liqi_yeye.department = "无";
Console.Write(" 姓名:" + liqi_yeye.name);
Console.Write(" 关系:" + liqi_yeye.relation);
Console.Write(" 年龄:" + liqi_yeye.Age);
Console.Write(" 单位:" + liqi_yeye.place);
Console.WriteLine(" 部门:" + liqi_yeye.department);
Console.ReadKey();
}
}
c#初体验的更多相关文章
- .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
不知不觉,“.NET平台开源项目速览“系列文章已经15篇了,每一篇都非常受欢迎,可能技术水平不高,但足够入门了.虽然工作很忙,但还是会抽空把自己知道的,已经平时遇到的好的开源项目分享出来.今天就给大家 ...
- Xamarin+Prism开发详解四:简单Mac OS 虚拟机安装方法与Visual Studio for Mac 初体验
Mac OS 虚拟机安装方法 最近把自己的电脑升级了一下SSD固态硬盘,总算是有容量安装Mac 虚拟机了!经过心碎的安装探索,尝试了国内外的各种安装方法,最后在youtube上找到了一个好方法. 简单 ...
- Spring之初体验
Spring之初体验 Spring是一个轻量级的Java Web开发框架,以IoC(Inverse of Control 控制反转)和 ...
- Xamarin.iOS开发初体验
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAKwAAAA+CAIAAAA5/WfHAAAJrklEQVR4nO2c/VdTRxrH+wfdU84pW0
- 【腾讯Bugly干货分享】基于 Webpack & Vue & Vue-Router 的 SPA 初体验
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57d13a57132ff21c38110186 导语 最近这几年的前端圈子,由于 ...
- 【Knockout.js 学习体验之旅】(1)ko初体验
前言 什么,你现在还在看knockout.js?这货都已经落后主流一千年了!赶紧去学Angular.React啊,再不赶紧的话,他们也要变out了哦.身旁的90后小伙伴,嘴里还塞着山东的狗不理大蒜包, ...
- 在同一个硬盘上安装多个 Linux 发行版及 Fedora 21 、Fedora 22 初体验
在同一个硬盘上安装多个 Linux 发行版 以前对多个 Linux 发行版的折腾主要是在虚拟机上完成.我的桌面电脑性能比较强大,玩玩虚拟机没啥问题,但是笔记本电脑就不行了.要在我的笔记本电脑上折腾多个 ...
- 百度EChart3初体验
由于项目需要在首页搞一个订单数量的走势图,经过多方查找,体验,感觉ECharts不错,封装的很细,我们只需要看自己需要那种类型的图表,搞定好自己的json数据就OK.至于说如何体现出来,官网的教程很详 ...
- Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验
Python导出Excel为Lua/Json/Xml实例教程(二):xlrd初体验 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出E ...
- Docker初体验
## Docker初体验 安装 因为我用的是mac,所以安装很简单,下载dmg下来之后拖拽安装即可完成. 需要注意的就是由于之前的docker是基于linux开发,不支持mac,所以就出现了docke ...
随机推荐
- 内网渗透之信息收集-windows
用户相关 query user #查看当前在线的用户 whoami #查看当前用户 net user #查看当前系统全部用户 net1 user #查看当前系统全部用户(高权限命令) net user ...
- 小米和MAC触摸板手势汇总
小米的触摸手势: 左键:单指单击 右键:双指单击 选取并打开:单指双击 滚动页面:双指 移动 拖拽项目:双击并拖拽 放大/缩小:双指张开,双指捏合 MAC触摸板手势: http://www.cr173 ...
- hbase伪分布式环境的搭建
一,实验环境: 1, ubuntu server 16.04 2, jdk,1.8 3, hadoop 2.7.4 伪分布式环境或者集群模式 4, hbase-1.2.6.tar.gz 二,环境的搭建 ...
- idea使用maven的打包工具package不会打上主类解决方法
- vs中python包安装教程
vs安装python很简单,只需要在vs安装包中选择python就可以了,这里使用的python3.7: 如果有了解,都知道安装python包的指令:"pip install xxx&quo ...
- C - Oulipo
The French author Georges Perec (1936–1982) once wrote a book, La disparition, without the letter 'e ...
- getline()的使用注意
在使用getline读入一整行时,若是前面是使用getchar().cin这类读入了一个字母,但是不会读入后续换行\n符号或者空格的输入时,再接getline()就容易出现问题. 这是因为输入数字之后 ...
- HDU - 3374 String Problem (kmp求循环节+最大最小表示法)
做一个高产的菜鸡 传送门:HDU - 3374 题意:多组输入,给你一个字符串,求它最小和最大表示法出现的位置和次数. 题解:刚刚学会最大最小表示法,amazing.. 次数就是最小循环节循环的次数. ...
- k倍区间(解题报告)前缀和简单应用
测评地址 问题 1882: [蓝桥杯][2017年第八届真题]k倍区间 时间限制: 1Sec 内存限制: 128MB 提交: 351 解决: 78 题目描述 给定一个长度为N的数列,A1, A2, . ...
- B-number HDU - 3652
题意: 找出区间[li,ri]有多少个符合要求的数: 1.这个数里面有13 2.这个数可以被13整除 题解: 这个题目和之前的有点不一样就是这个题目要我们求包含13的(之前做过的都是不包含).但是都差 ...