2017-03-02
out 关键字指定所给的参数为一个输出参数 该参数的值将返回给函数调用中使用的变量
注意事项 1未赋值的变量用作ref参数是非法的,但是可以把未赋值的变量用作out参数
2 在函数使用out参数时,必须把它看成尚未赋值
例如:
static void Main(string[] args)
{
//int myNunber = 5;
//Console.WriteLine("mynumber is {0}",myNunber);
//DoubleValue(ref myNunber);
//Console.WriteLine(myNunber);
int[] myArray = { 1,4,2,5,6,7,8,0,9,3};
int maxIndex;
Console.WriteLine(MaxValue(myArray,out maxIndex));
Console.WriteLine($"{maxIndex+1}");
Console.ReadKey();
}
public static int MaxValue(int[] myArray, out int maxIndex)
{
int maxValue = myArray[0];
maxIndex = 0;
for (int i = 0; i < myArray.Length; i++)
{
if (myArray[i] > maxValue)
{
maxValue = myArray[i];
maxIndex = i;
}
}
return maxValue;
}
ref 引用传参 函数处理的变量和函数调用中使用的变量相同,而不仅仅是值相同的变量。对这个变量做的任何的改变都会影响用作参数的变量值 用ref关键字指定参数
注意 两个限制 1 必须在函数调用中使用"非常量的变量" 2必须使用初始化过的变量 const 定义该变量始终为常量 限制一个变量被改变,只读变量 在定义的时候初始化,之后不能被更改
例如:
namespace Ref和Out
{
class Program
{
static void Main(string[] args)
{
int myNunber = 5;
Console.WriteLine("mynumber is {0}",myNunber); //5
DoubleValue(ref myNunber);//10
Console.WriteLine(myNunber);//10
Console.ReadKey();
}
public static void DoubleValue(ref int val)
{
val =val* 2;
Console.WriteLine($"the value is {val}");
}
}
}
Params
当需要传递多个参数或者参数的个数不确定的时候,就可以使用params类型的参数。例如
namespace Params
{
class Program
{
static void Main(string[] args)
{
UserParams(1,2,3);
UserParamsTwo("1","test",true);
int[] myArray = { 1, 2, 3, 4, 5 };
UserParams(myArray);
Console.ReadKey();
}
public static void UserParams(params int[] list)
{
for (int i = 0; i < list.Length; i++)
{
Console.WriteLine(list[i]);
}
Console.WriteLine();
}
public static void UserParamsTwo(params object[] list)
{
foreach (var i in list)
{
Console.WriteLine(i);
}
Console.WriteLine();
}
}
}
1 构造函数
作用是初始化对象,对对象的属性依次的赋值 没有返回值 没有void 构造函数的名称必须和类名一致 构造函数也可以实现重载
创建对象的时候调用构造函数 每个类都会有一个默认的无参数的构造函数 当显示的声明了一个构造函数后,默认的无参数的构造函数就被干掉了
2 重载
函数名称相同,参数的个数或者类型不同
3 this
1代表当前类的对象 2 显示的调用当前类的构造函数
4 构造函数调用构造函数
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;
}
:this
public Student(string name, int age, char gender):this(name,age,gender,0,0,0)
{
//this.Name = name;
//this.Age = age;
//this.Gender = gender;
}
5 属性 property 字段 fileds 方法 method
作用是保护字段 对字段的取值和赋值做限制 其本质就是一个get方法 一个set方法
6 析构函数
程序执行结束的时候 执行析构函数 现在c#中有一个GC垃圾回收机制
7 继承 基类/父类 派生类/子类
子类隐式的获得父类的除构造函数和析构函数以为的所有成员 ???
子类只能有一个直接父类 所以c#不能实现多重继承 而父类可以有多个直接子类 所以继承是可以传递的;
如果class b 派生出 class c ; class a 派生出 class b 那么 class c会继承 class a 和class b的声明的成员;
可以实现某个类禁止被其他类继承吗? c#提供了一个 sealed修饰符 会阻止其他类继承改基类
//父类 person
public class person
{
//字段
private string _name;
private int _age;
private char _gender;
//属性
public string Name {get;set;}
public int Age {get;set;}
pubic char Gender {get;set;}
//构造函数
public person(string name,int age,char gender)
{
this.Name=name;this.Age=age;this.Gender=gender;
}
//自定义函数
public void SayHello()
{
console.writeline("我是{0},我今年{1}岁了,我是{2}生",this.Name,this.Age,this.Gender);
}
}
//第一个子类 reporter 记者类 继承父类 person
public class repoter:person
{
//字段
private string _hobby;
//属性
public string Hobby{get;set;}
//构造函数 继承父类的
public reporter(string name,int age,char gender,string hobby):base(name,age,gender)
{
this.Hobby=hobby;
}
//自定义函数
public void reporterSayHello()
{
console.writeline("我是{0},我今年{1}岁了,我是{2}生,我的爱好是{3}",this.Name,this.Age,this.Gender,this.Hobby);
}
}
//第二个子类 programmer 继承父类person
public class programmer:person
{
//字段
private int _iWorkYear;
//属性
public int iWrokYear{get;set;}
//构造函数 继承父类
pulic programmer(string name,int age,char gender,int iWorkYear):base(name,age,gender)
{
this.iWrokYear=iWorkYear;
}
//自定义函数
public void programmerSayHello()
{
console.writeline("我是{0},我今年{1}岁了,我是{2}生,我的工作年限是{3}",this.Name,this.Age,this.Gneder,this.iWorkYear);
}
}