变量声明(不允许重复声明)的语法:类型 + 变量名,如
void Main() { int num; string name; }
变量声明时,可以采用隐式局部变量:var
需要在声明时赋值,声明后类型固定,如
void Main() { var num = 12; var name = "derek"; Console.WriteLine (num); Console.WriteLine (name); }
同时,使用var可以声明一些临时变量(匿名类型:只读),如
void Main() { var myVar = new{Name="derek",Num=12}; Console.WriteLine (myVar.Name); Console.WriteLine (myVar.Num); }
变量赋值:注意类型匹配,赋值前是不允许使用的,因为C#使用的是强类型识别系统(RTTI)
未赋值直接使用时:
使用字面值为变量赋值:
void Main() { int num; string name; num = 12; name = "derek"; Console.WriteLine (num); Console.WriteLine (name); }
使用表达式为变量赋值:
void Main() { var myVar = DateTime.Now.ToLongDateString(); var fullName = "lastName" + " " + "firstName"; Console.WriteLine (myVar); Console.WriteLine (fullName); }
使用变量为变量赋值:
void Main() { var firstName = "ramm"; var lastName = "derek"; var fullName = firstName + lastName; Console.WriteLine (fullName); }
常量:(静态常量:const,动态常量:readonly)
const用于项目运行过程中不变化的值,readonly允许在初始化中赋值,作为只读对象访问
比如圆周率,养老保险比例等,可以声明为const
void Main() { const double PI = 3.14; Console.WriteLine ("请输入半径"); double radius = Convert.ToDouble(Console.ReadLine()); Console.WriteLine ("您输入的的半径是:{0}", radius); Console.WriteLine ("圆周长:{0},面积:{1}",2 * PI * radius, PI * radius * radius); }
readonly通常用于只读操作,比如连接字符串等,readonly不允许修饰方法内的局部变量
void Main() { var da = new SqlDataAdapter("select * from Book",connectionString); var ds = new DataSet(); da.Fill(ds); ds.Dump(); } //定义数据库连接字符串 readonly string connectionString = @"Data Source=.;Initial Catalog=BookStoreDB;Integrated Security=True";
常见变量命名错误(具体解决办法,参考开发工具给出的错误提示)
- 命名不正确(比如使用系统关键字)
- 变量没有声明就使用
- 变量没有赋值就使用
- 声明了重复的变量名
变量赋值时类型不一致
类型转换:隐式(从小范围向大范围转换,从子类向父类转换)和显式转换
显式转换:
- 基本数据类型转换:Convert
Convert.ToDateTime("2010-1-1 18:22:33").Dump();
- 字符串转基本类型:Parse()方法
Console.WriteLine (decimal.Parse("123.456").ToString("C"));
- 对象转字符串类型:ToString()方法
Console.WriteLine (123.456M.ToString("C"));Console.WriteLine (DateTime.Now.ToString("D"));
关于类型转换的关键字:
判断类型:is
void Main() { Console.WriteLine (123 is string); Console.WriteLine ("123" is string); Console.WriteLine (true is string); Console.WriteLine (true is object); }
强制类型转换:() 转换失败时抛出异常(LINQ Pad实现)
void Main() { var book = Books.First(); var price = (decimal)book.Price; var pubDate = (DateTime)book.PubDate; price.Dump(); pubDate.Dump(); }
强制类型转换:as 转换失败时返回null
void Main() { Person s = new Student(); Person t = new Teacher(); var p1 = s as Teacher; var p2 = s as Person; var p3 = t as Teacher; p1.Dump(); p2.Dump(); p3.Dump(); } class Person{} class Student : Person{} class Teacher : Person{}
上面的代码涉及到了另一个问题:装箱(值类型->引用类型)和拆箱(引用类型->值类型)
其中装箱:
object obj = 123;
其中拆箱:
void Main() { object obj = 123; //装箱 int num = (int)obj; //拆箱 }
频繁装箱和拆箱会影响性能(涉及到堆栈的内存分配),
但是装拆箱的目的其实是提高代码(尤其是方法参数)的灵活性
时间: 2024-11-05 22:02:12