类中的数据和函数称为类的成员。
类还可以包含嵌套的类型,例如其他类。
一、数据成员。
数据成员包括字段、常量和事件。
字段是与类相关的变量。
常量与类的关联方式同变量与类的关联方式一样,使用const关键字来声明常量,如果声明为public,就可以在类的外部访问。例如:
class PhoneCustomer
{
public const string DayOfSendingBill="Monday";
public int CustomerID;
public String FirstName;
public String LastName;
}
事件是类的成员,发生某些行为(例如改变类的字段或属性,或者进行了某种形式的用户交互操作)时,它可以让对象通知调用程序。客户可以包含所谓“事件处理程序”的代码来响应该事件。
二、函数成员。
函数成员提供了操作类中数据的某些功能,包括方法、属性、构造函数和终结器、运算符以及索引器。
方法是与某个类相关的函数,它们可以是实例方法,也可以是静态方法。
属性是可以在客户机上访问的函数组,其访问方式与访问类的公共字段类似。
构造函数是在实例化对象时自动调用的函数。必须与所属的类同名,且不能有返回类型。用于初始化字段的值。
终结器类似于构造函数,在CLR检测到不再需要某个对象时调用。它们的名称与类相同,前面有一个~符号。不能预测什么时候调用终结器。
运算符例如+-,c#允许指定把已有的运算符应用于自己的类(运算符重载)。
索引器允许对象以数组或集合的方式进行索引。
1、方法。
在c#中每个函数都必须与类或结构相关。
c#中,方法的定义包括方法的修饰符,返回值类型,方法名,输入参数的列表和方法体。
[modifiers] return_type MethodName([parameters])
{
//Method body
}
方法中可以包含任意个return语句。
public bool IsPositive(int value)
{
if (value<0)
return false;
return true;
}
下面的例子MathTest说明了类的定义和实例化、方法的定义和调用的语法。
using System;
namespace Wrox.ProCSharp.MathTestSample
{
class MainEntryPoint4
{
static void Main()
{
//try calling some static functions
Console.WriteLine("Pi is "+MathTest.GetPi());
int x= MathTest.GetSquareOf(5);
Console.WriteLine("Square of 5 is "+x);
MathTest math=new MathTest();
math.value=30;
Console.WriteLine("Value field of math variable contains "+math.value);
Console.WriteLine("Square of 30 is "+math.GetSquare());
}
}
class MathTest
{
public int value;
public int GetSquare()
{
return value*value;
}
public static int GetSquareOf(int x)
{
return x*x;
}
public static double GetPi()
{
return 3.14159;
}
}
}
输出结果:
Pi is 3.14159
Square of 5 is 25
Value field of math variable contains 30
Square of 30 is 900
注意:参数可以通过引用或值传递给方法。对于复杂的数据类型,按引用传递的效率更高。
C#中所有的参数都是通过值来传递的,除非特别说明。但是如果数组或者类等引用类型传递给方法,则是通过引用类型来传递的。
下面的例子说明了这一点。
using System;
namespace Wrox.ProCSharp.ParameterTestSample
{
class ParameterTest
{
static void SomeFunction(int[] ints,int i)
{
ints[0]=100;
i=100;
}
public static int Main()
{
int i=0;
int[] ints={0,1,2,4,8};
ConsoleWriteLine("i= "+i);
ConsoleWriteLine("ints[0]= "+ints[0]);
ConsoleWriteLine("Calling SomeFunction...");
SomeFunction(ints,i);
ConsoleWriteLine("i= "+i);
ConsoleWriteLine("ints[0]= "+ints[0]);
return 0;
}
}
}
输出结果:
i= 0
ints[0]= 0
Calling SomeFunction...
i= 0
ints[0]= 100
使用ref关键字可以强制使用引用传递。调用方法还需要添加ref关键字:
SomeFunction(ints,ref i);
例如:上例修改一下:
using System;
namespace Wrox.ProCSharp.ParameterTestSample
{
class ParameterTest
{
static void SomeFunction(int[] ints,ref int i)
{
ints[0]=100;
i=100;
}
public static int Main()
{
int i=0;
int[] ints={0,1,2,4,8};
Console.WriteLine("i= "+i);
Console.WriteLine("ints[0]= "+ints[0]);
Console.WriteLine("Calling SomeFunction...");
SomeFunction(ints,ref i);
Console.WriteLine("i= "+i);
Console.WriteLine("ints[0]= "+ints[0]);
return 0;
}
}
}
输出结果:
i= 0
ints[0]= 0
Calling SomeFunction...
i= 100
ints[0]= 100
注意:无论是按值还是按引用传递,变量都必须初始化。
函数从一个例程中输出多个值,可以使用输出参数,输出参数可以不提前初始化值,输出参数用out关键字初始化,该变量通过引用传递,调用该方法时,还需要使用out关键字。
例如:
using System;
namespace Wrox.ProCSharp.ParameterTestSample
{
class ParameterTest
{
static void SomeFunction(out int i)
{
i=100;
}
public static int Main()
{
int i=0;
int[] ints={0,1,2,4,8};
Console.WriteLine("i= "+i);
Console.WriteLine("Calling SomeFunction...");
SomeFunction(out i);
Console.WriteLine("i= "+i);
return 0;
}
}
}
输出结果:
i= 0
Calling SomeFunction...
i= 100
如果在方法体中没有给out参数分配一个值,该方法就不能编译。
c#支持方法的重载,方法名相同,但参数的个数和类型不同。但不支持默认参数。
例如:
class ResultDisplayer
{
void displayResult(String result)
{
//implementation
}
void displayResult(int result)
{
//implementation
}
}
c#不直接支持可选参数,所以需要使用方法重载来达到此目的:例如:
class Myclass
{
int DoSomething(int x)
{
DoSomething(x,10);
}
int DoSomething(int x,int y)
{
//implementation
}
}
0 评论:
发表评论