一、
上次学习学到了方法。接下来看看一个调用方法的例子:计算一到x的和。
分别使用递归和迭代两种,还引入了静态成员与实例成员引用的不同。
//使用迭代和实例成员
namespace ConsoleAppPractice
{
class Program
{
static void Main(string[] args)
{
SumNumber result = new SumNumber();
Console.WriteLine(result.Sum(100));
}
}
class SumNumber
{
public int Sum(int x)
{
int sum = 0;
for (int i = 0; i <= x; i++)
{
sum += i;
}
return sum;
}
}
}
//使用递归和静态成员
class Program
{
static void Main(string[] args)
{
Console.WriteLine(SumNumber.Sum(100));
}
}
class SumNumber
{
public static int Sum(int x)
{
if (x==1)
{
return 1;
}
else
{
int result = x + Sum(x - 1);
return result;
}
}
}
二、类型的概念
类型又名数据类型,对数值存储、数值的调用有很大作用,同时每个类型都配备有各自许多独特的方法。
编程语言可分为强类型语言和弱类型语言。
如JavaScript就是一种弱类型。
C#是一种强类型语言。
比如,若short b=20;int a=b;
不会报错。但是如果把L赋值给int就会报错。
再比如,C#有bool类型,bool的值只能是true或者false。bool = 1或者int a = (1>10)这两个式子编译器都会报错。
但是C#也提供了一种弱类型叫作dynamic。
dynamic a = 20;
Console.WriteLine(a);
a = "hello!";
Console.WriteLine(a);
//运行结果:20\nhello!
三、类型的作用
一个类型包含有许多信息:
1.储存此类型所需的内存空间大小。
2.最大最小值范围
3.此类型包含的成员(方法、属性、事件等)
用处有静态和动态两方面。此处的静态与动态指的是整个程序。
这里的静态指的是程序编辑或编译的过程,动态指的是运行的过程。
4.此类型由何基派衍生
5.此类型允许什么操作
6.运行时,此类型分配在内存的什么位置
此处引入堆与栈的概念
内存空间可分为堆与栈这两种。
栈很小很快(可能只有几M),是用来给方法调用时使用的。如果方法调用太多或者栈溢出(StackOverflow)会爆掉。
堆很大(可能有几个G?), 是用来储存对象实例的。忘了回收对象,内存会浪费(学名内存泄漏)。但是C#会帮你找到合适的时机释放内存,不用手动释放,相对比较安全。
//让栈爆掉的代码:
namespace ConsoleAppPractice
{
class Program
{
static void Main(string[] args)
{
BadGuy bg = new BadGuy();
bg.BadMethod();
}
}
class BadGuy
{
public void BadMethod()
{
this.BadMethod();
}
}
}
//使用windows+r键,输入perfmon打开观测窗,观察堆的变化
四、C#语言的类型系统
定义数据类型需要用class、enum、strcuct等关键字(具体见下图)。但是有很多现成的数据类型。我们一般用现成的。这两个要注意分清
五大数据类型:
1.类(Classes) 如Windows,Form,Console,String
如果类太常用,会被吸收为关键字。
//证明一个东西是不是类的两种方法:
static void Main(string[] args)
{
Type myType = typeof(Form);
Console.WriteLine(myType.FullName);
Console.WriteLine(myType.IsClass);
}
//或者可以右键,然后点击go to definition
2.结构体(Structures) 如Int32,Int64,Char,Single,Double
3.枚举(Enumerations)
//用于将window弹出来就最大化。
static void Main(string[] args)
{
Form f = new Form();
f.WindowState = FormWindowState.Maximized;//此处有三个选项:maximized,normal,minimized。说明是枚举类型。
f.ShowDialog();
}
//该枚举类型内部的定义
public enum FormWindowState
{
Normal = 0,
Minimized = 1,
Maximized = 2
}
4.接口(Interfaces)
5.委托(Delegates)
五、变量
1.变量的定义
变量=以变量名所对应的内存地址为起点,以其数据类型所要求的存储空间为长度的一块内存区域
2.变量的功能
(1)存储数值
(2)变量名所对应的位置就是这个变量的值在内存中所对应的位置
(3)每个变量都有一个类型,决定了什么样的数据能够存进去
3.变量的种类
七种:静态变量,实例变量(成员变量,字段),数组元素,值参数,引用参数,输出形参,局部变量
一般叫变量就是指局部变量
局部变量就是方法(函数体)里声明的变量。注,在类中声明的变量可不是局部变量,一定是在方法中
namespace ConsoleAppPractice
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(哈哈.amount);
//静态成员可以直接用类名访问
哈哈 c = new 哈哈();
c.a = 1;
//实例成员需引用变量后才能访问。
Console.WriteLine(c.str);
Console.WriteLine(c.a);
}
}
class 哈哈
{
public int a = 0;
public static int amount = 1;
public string str = "haha";
}
}
注意,此处这坨public很像类的属性,但是这不安全,故演化为更加安全的属性,保护字段。