主要针对已经有了c++等语言基础再进行学习做出的笔记。
环境自己配置,只需要在高级环境变量里加上C:\Windows\Microsoft.NET\Framework\v4.0.30319即可。
可以用notepad++等编写代码,在cmd里运行,csc + 文件名.cs。
也可以在vs里面编码。初级先用第一种方式。
一、装箱和拆箱
装箱:值类型转换为对象类型。实例:
int val = 8;
object obj = val;//整型数据转换为了对象类型
拆箱:之前由值类型转换而来的对象类型再转回值类型。实例:
int val = 8;
object obj = val; //先装箱
int nval = (int) obj;//再拆箱
二、显式转换和隐式转换
隐式转换: C# 默认的以安全方式进行的转换, 不会导致数据丢失。例如,从小的整数类型转换为大的整数类型,从派生类转换为基类。
强制转换:强制类型转换。显式转换需要强制转换运算符,而且强制转换会造成数据丢失,或者转换失败。
实例:
namespace TypeConvertion
{ class Class1
{
}
class Class2 : Class1 //类Class2是类Class1的子类
{
}
class Program
{
static void Main(string[] args)
{
int inum = 100;
long lnum = inum; // 进行了隐式转换,将 int 型(数据范围小)数据转换为了 long 型(数据范围大)的数据
Class1 c1 = new Class2(); // 这里也是隐式转换,将一个新建的 Class2 实例转换为了其基类 Class1 类型的实例 C1
}
}
}
拓展——-类型转换
不同的类型可以转换成字符串,函数ToString()—-同Java。实例如下:
namespace TypeConversionApplication
{
class StringConversion
{
static void Main(string[] args)
{
int i = 75;
float f = 53.005f;
double d = 2345.7652;
bool b = true;
Console.WriteLine(i.ToString());
Console.WriteLine(f.ToString());
Console.WriteLine(d.ToString());
Console.WriteLine(b.ToString());
Console.ReadKey();
}
}
}
当然,字符串也可以转换成其他类型。实例如下:
using System;
namespace NumberConversion
{
class Program
{
static void Main(string[] args)
{
//用Convert(string s)转换
string str = 123.ToString();
int i = Convert.ToInt16(str);
Console.WriteLine(i);
//用Parse(string s)转换
int ii = int.Parse(str);
Console.WriteLine(ii);
//用TryParse(sring s,out int i)转换
string str1 = "abcd";
string str2 = "1234";
int a,b;
bool bo1 = int.TryParse(str1,out a);
Console.WriteLine(str1+" "+bo1+" "+a);
bool bo2 = int.TryParse(str2,out b);
Console.WriteLine(str2+" "+bo2+" "+b);
Console.ReadKey();
}
}
}
注意:int.TryParse()但是该方式比int.Parse(string s) 好一些,它不会出现异常,最后一个参数result是输出值,如果转换成功则输出相应的值,转换失败则输出0。
输出:
123
123
abcd False 0
1234 True 1234
三、接受用户输入
System 命名空间中的 Console 类提供了一个函数 ReadLine(),用于接收来自用户的输入,并把它存储到一个变量中。例如:
int num;
num = Convert.ToInt32(Console.ReadLine());
注意:函数 Convert.ToInt32() 把用户输入的数据转换为 int 数据类型,因为 Console.ReadLine() 只接受字符串格式的数据。
四、常量表示
整数常量不多赘述,浮点常量的表示方法需要注意一下,给出例子:
3.14159 /* 合法 */
314159E-5L /* 合法 */
510E /* 非法:不完全指数 */
210f /* 非法:没有小数或指数 */
.e55 /* 非法:缺少整数或小数 */
还有转义字符,不多赘述,给出表格:
转义序列 含义
\\ \ 字符
\' ' 字符
\" " 字符
\? ? 字符
\a Alert 或 bell
\b 退格键(Backspace)
\f 换页符(Form feed)
\n 换行符(Newline)
\r 回车
\t 水平制表符 tab
\v 垂直制表符 tab
\ooo 一到三位的八进制数
\xhh . . . 一个或多个数字的十六进制数
五、运算
虽然和C++没有差别,但是C++的时候就爱忘记,所以个别还是记下来。
c = a++; //先将 a 赋值给 c,再对 a 进行自增运算。
c = ++a; //先将 a 进行自增运算,再将 a 赋值给 c 。
c = a--; //先将 a 赋值给 c,再对 a 进行自减运算。
c = --a; // 先将 a 进行自减运算,再将 a 赋值给 c 。
六、Internal访问修饰符
public、private、protected等不多赘述,和C++一样。
Internal 访问说明符允许一个类将其成员变量和成员函数暴露给当前程序中的其他函数和对象。换句话说,带有 internal 访问修饰符的任何成员可以被定义在该成员所定义的应用程序内的任何类或方法访问。
例如:
using System;
namespace RectangleApplication
{
class Rectangle
{
//成员变量
internal double length;
internal double width;
//没带任何访问修饰符,默认为private
double GetArea()
{
return length*width;
}
public void Display()
{
Console.WriteLine("长度:{0}",length);
Console.WriteLine("宽度:{0}",width);
Console.WriteLine("面积:{0}",GetArea());
}
}
class ExecuteRectangle
{
static void Main(string[] args)
{
Rectangle r = new Rectangle();
r.length = 4.5;
r.width = 3.5;
r.Display();
Console.ReadLine();
}
}
}
输出结果如下:
长度:4.5
宽度:3.5
面积:15.75
七、传参
和c++类似,c#的传递方式有三个,分别是:
值参数:这种方式复制参数的实际值给函数的形式参数,实参和形参使用的是两个不同内存中的值。在这种情况下,当形参的值发生改变时,不会影响实参的值,从而保证了实参数据的安全。
引用参数:这种方式复制参数的内存位置的引用给形式参数。这意味着,当形参的值发生改变时,同时也改变实参的值。
输出参数:这种方式可以返回多个值。
值参数不多赘述,下面是引用参数的代码方式:
using System;
namespace CalculatorApplication
{
class NumberManipulator
{
public void swap(ref int x, ref int y)
{
int temp;
temp = x; /* 保存 x 的值 */
x = y; /* 把 y 赋值给 x */
y = temp; /* 把 temp 赋值给 y */
}
static void Main(string[] args)
{
NumberManipulator n = new NumberManipulator();
/* 局部变量定义 */
int a = 100;
int b = 200;
Console.WriteLine("在交换之前,a 的值: {0}", a);
Console.WriteLine("在交换之前,b 的值: {0}", b);
/* 调用函数来交换值 */
n.swap(ref a, ref b);
Console.WriteLine("在交换之后,a 的值: {0}", a);
Console.WriteLine("在交换之后,b 的值: {0}", b);
Console.ReadLine();
}
}
}
输出结果如下:
在交换之前,a 的值:100
在交换之前,b 的值:200
在交换之后,a 的值:200
在交换之后,b 的值:100
解释:原理和C++一样,若不懂,可参考C++primer手册。
输出参数和C++也是不一样的。代码方式如下:
using System;
namespace CalculatorApplication
{
class NumberManipulator
{
public void getValue(out int x )
{
int temp = 5;
x = temp;
}
static void Main(string[] args)
{
NumberManipulator n = new NumberManipulator();
/* 局部变量定义 */
int a = 100;
Console.WriteLine("在方法调用之前,a 的值: {0}", a);
/* 调用函数来获取值 */
n.getValue(out a);
Console.WriteLine("在方法调用之后,a 的值: {0}", a);
Console.ReadLine();
}
}
}
输出结果如下:
在方法调用之前,a 的值: 100
在方法调用之后,a 的值: 5
提示:提供给输出参数的变量不需要赋值。当需要从一个参数没有指定初始值的方法中返回值时,输出参数特别有用。