在本章节内容,主要关于类的细节处理和结构体一点点介绍。
2.1 类和结构
类和结构体实际上都是创建对象的模板,每个对象都有包含数据,并提供了处理和访问的方法。类和结构体得区别是他们在内存的存储方式上的引用,类是存储在堆上的引用类型,而机构体是存储在堆栈上的值类型。在较小的数据类型使用结构可以提高性能,但在语法上和类很相似。主要区别在于是使用关键字struct代替class来声明结构体。
代码如下:
struct PhoneStruct //结构体
{
string firstName;
string lastName;
}
{
string firstName;
string lastName;
}
2.2 ref参数
ref参数,是指类中一般方法的ref参数。如果一个方法的参数前带有ref关键字,则该方法对变量所作的任何改变 都会影响到原来对象的值。
using System;
using System.Collections.Generic;
namespace CSharpDemo
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(TimeOfDay.Moring);
int i = 20;
doSomeThing(ref i);
Console.WriteLine(i.ToString());
}
public enum TimeOfDay
{
Moring=0,
AfterNoon=1,
Evening=2
}
static void doSomeThing(ref int i)
{
i = i + 100;
}
}
}
using System.Collections.Generic;
namespace CSharpDemo
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(TimeOfDay.Moring);
int i = 20;
doSomeThing(ref i);
Console.WriteLine(i.ToString());
}
public enum TimeOfDay
{
Moring=0,
AfterNoon=1,
Evening=2
}
static void doSomeThing(ref int i)
{
i = i + 100;
}
}
}
注意事项:在传递给方法前,无论是值传递,还是引用传递,变量都需要初始化。
2.3 out 关键字
在方法的输入参数前面加了out关键字时,传递给对方的变量可以不初始化。
using System;
using System.Collections.Generic;
namespace CSharpDemo
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(TimeOfDay.Moring);
int i;
doSomeThing(out i);
Console.WriteLine(i.ToString());
}
public enum TimeOfDay
{
Moring=0,
AfterNoon=1,
Evening=2
}
static void doSomeThing(out int i)
{
i = 100;
}
}
}
using System.Collections.Generic;
namespace CSharpDemo
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(TimeOfDay.Moring);
int i;
doSomeThing(out i);
Console.WriteLine(i.ToString());
}
public enum TimeOfDay
{
Moring=0,
AfterNoon=1,
Evening=2
}
static void doSomeThing(out int i)
{
i = 100;
}
}
}
out和ref区别:
ref是传递参数的地址,out是返回值,两者有一定的相同之处,不过也有不同点。
使用ref前必须对变量赋值,out不用。
out的函数会清空变量,即使变量已经赋值也不行,退出函数时所有out引用的变量都要赋值,ref引用的可以修改,也可以不修改。
2.4 方法重载
方法重载只需声明同名但参数个数或者类型不同的方法即可
//方法重载
public void doSomeThing(int i)
{
i = 100;
}
//方法重载
public void doSomeThing(string i)
{
i = "111";
}
public void doSomeThing(int i)
{
i = 100;
}
//方法重载
public void doSomeThing(string i)
{
i = "111";
}