表达式和语句都是为方法服务的。
操作符 + 操作数 组成 表达式;
表达式后面加分号;组成语句。
语句则是为了组成方法体。
操作符也叫作运算符:operator。
操作数:operand
操作符不能脱离与它相关联的数据类型。
int x = 5;
int y = 4;
Console.WriteLine(x/y); // 1
double a = 5.0;
double b = 4.0;
Console.WriteLine(a/b); //1.25
为什么要发明运算符?
运算符是对算式的简记法,简写,在编程语言中操作符的本质是函数(即算法)的简记法。
有如下函数:给一个对象,创造一个足球队。其中有一个函数GetMarry。给一个对象。
namespace test
{
class Program
{
static void Main(string[] args)
{
Person person1 = new Person();
Person person2 = new Person();
person1.Name = "Deer";
person2.Name = "Deer's wife";
List<Person> nation = Person.GetMarry(person1, person2);
foreach (var p in nation)
{
Console.WriteLine(p.Name);
}
}
}
class Person
{
public string Name;
public static List<Person> GetMarry(Person p1, Person p2)
{
List<Person> people = new List<Person>();
people.Add(p1);
people.Add(p2);
for (int i = 0; i < 11; i++)
{
Person child = new Person();
child.Name = p1.Name + "&" +p2.Name + "'s child" + i;
people.Add(child);
}
return people;
}
}
}
下面我们通过运算符来简写这部分代码:
{
class Program
{
static void Main(string[] args)
{
Person person1 = new Person();
Person person2 = new Person();
person1.Name = "Deer";
person2.Name = "Deer's wife";
List<Person> nation = person1 + person2;
foreach (var p in nation)
{
Console.WriteLine(p.Name);
}
}
}
class Person
{
public string Name;
public static List<Person> operator +(Person p1, Person p2)
{
List<Person> people = new List<Person>();
people.Add(p1);
people.Add(p2);
for (int i = 0; i < 11; i++)
{
Person child = new Person();
child.Name = p1.Name + "&" +p2.Name + "'s child" + i;
people.Add(child);
}
return people;
}
}
}
改写部分:第20行重新定义了一个运算符。在第10行中应用,效果与函数效果相同,所以运算符说是函数的简记法。
x.y运算符:成员访问操作符
1、访问外层名称空间的子集名称空间;比如:System.IO
2、访问名称空间中的类型;比如:System.IO.File
3、访问类型的静态成员;比如:System.IO.File.Create("D:\\helloWorld.txt");
4、访问对象的成员。示例如下:实例对象myForm下面的成员:属性Text和方法ShowDialog()方法。
using System.Windows.Forms;
Form myForm = new Form();
myForm.Text = "Hello,World!";
myForm.ShowDialog();
f(x):圆括号,就叫做方法调用操作符。
f是方法的名称。x是方法的参数。圆括号就是方法调用操作符。
在我们调用函数方法的时候,这对圆括号是不能省的。比如如下代码:我们想要调用HelloWorld必须加上圆括号。
class Program
{
static void Main(string[] args)
{
Calculator c = new Calculator();
c.MyAdd(2.0, 3.0);
c.HelloWorld();
}
}
class Calculator
{
public double MyAdd(double a, double b)
{
return a + b;
}
public void HelloWorld()
{
Console.WriteLine("hello World!");
}
}
只要调用函数就必须加圆括号吗?
在Csharp中不一定。委托,我们不直接去调用这个方法,去做这件事,我们通过委托来做这事。如下:
class Program
{
static void Main(string[] args)
{
Calculator c = new Calculator();
c.MyAdd(2.0, 3.0);
//c.HelloWorld();
Action myAction = new Action(c.HelloWorld);// 此委托:参数为空,无返回值。
myAction();
}
}
class Calculator
{
public double MyAdd(double a, double b)
{
return a + b;
}
public void HelloWorld()
{
Console.WriteLine("hello World!");
}
}
委托做这事有限制:无参数,无返回。类似于Thread,传入一个函数名。但是不同的是:Thread通过Thread.Start可以出入参数。python中有类似操作。本质只是应用指向问题。
在python中有如下代码;a = functionName。a()完成函数任务。委托中Action(FunctionName)。然后Action()完成FunctionName()的功能。
def myAdd(a, b):
return a+b
a = myAdd
print(a(3, 2))
a[i]元素访问操作符[]:方括号
int[] myIntArray = new int[]{1, 2, 3, 4 5}
其中的花括号,叫做初始化器。
元素访问修饰符除了整数索引以外,还有字典类型的字符串等类型的索引。一定放的是集合的索引。
class Program
{
static void Main(string[] args)
{
Dictionary<string, Student> StuDic = new Dictionary<string, Student>();
for (int i = 0; i <=100; i++)
{
Student stu = new Student();
stu.Name = "stu_" + i.ToString();
stu.Score = 100 + i;
StuDic.Add(stu.Name, stu);
}
Student number6 = StuDic["stu_6"];
Console.WriteLine(number6.Score);
}
}
class Student
{
public string Name;
public int Score;
}
typeof操作符:查看一个类型的内部结构
类型的内部结构:专业描述叫MetaData。翻译:元数据。包含了:父类信息,名称空间、属性,事件等。
Type t = typeof(int);
Console.WriteLine(t);
Console.WriteLine(t.Name);
Console.WriteLine(t.FullName);
int c = t.GetMethods().Length;
foreach (var me in t.GetMethods())
{
Console.WriteLine(me.Name);
}
Console.WriteLine(c);
// System.Int32
// Int32
// System.Int32
// 21
default:
重点看一下:结构体,引用,枚举三种类型。
1、结构体类型:
int a = default(int);
Console.WriteLine(a);
// 0
2、引用类型:
默认为null;
3、枚举类型:
class Program
{
static void Main(string[] args)
{
Level level = default(Level);
Console.WriteLine(level);
}
}
enum Level
{
Low,
Mid,
High
}
// Low
默认输出为枚举类型的第一个值。枚举类型可以显示的赋值。
class Program
{
static void Main(string[] args)
{
Level level = default(Level);
Console.WriteLine(level);
}
}
enum Level
{
Low=0,
Mid=1,
High=2
}
// Low
如果枚举中,没有赋值0,那么此时default可以会出错,返回值为0。
class Program
{
static void Main(string[] args)
{
Level level = default(Level);
Console.WriteLine(level);
}
}
enum Level
{
Low=1,
Mid=2,
High=3
}
// 0
所以枚举中,如果赋值,一定要有一个零值。