一:c#基本语法(1)(老田学习笔记)

代码
protected void Page_Load(object sender, EventArgs e)
    {
        
//变量名区分大小写
        string thc;
        thc 
= "天轰穿";
        Response.Write(thc);

        
string THC;
        THC 
= "田洪川";
        Response.Write(THC);

        
//同类型多变量定义方式.
        string aa = "111", bb = "222", cc = "333";
        Response.Write(aa
+"<br>"+bb+"<br>"+cc+"<br>");

        
//局部变量不赋值会报:"使用了未赋值的局部变量"这种错误,如:
        
//string tt;
        
//Response.Write(tt);

    }

 

在C#中,系统将为每个未经初始化的变量提供一个默认值。对于所有引用类型的变量,默认值是null。所有值类型的变量的默认值是固定的。

问题:既然未初始化的变量都有一个默认值了,那为什么我直接使用未赋值的变量时又会出现:"使用了未赋值的局部变量"这种错误?

 

解释:

 

局部变量是在堆栈中分配,编译器通常不加入额外代码为局部变量指定默认值,这就会导致局部变量的初始值不确定。这在C/C++代码中表现的尤其明显。C#编译器同样不会为局部变量默认添加一段代码赋予默认值,这往往是从效率上考虑。因为很多代码中对变量只是先声明,然后才使用,如果声明时就复制,势必影响效率,所以编译器把这个控制权放手给了代码编写者。

比如下面例子

int a;

SetA(out a);

这个代码是可以编译通过的,但如果在申明时就对a赋值,显然是多此一举的,这样做只会导致程序执行效率的下降,所以编译器是不会默认给局部变量赋值。

另外局部变量的分配内存的速度很快,只是移动堆栈指针就搞定了,不需要实际分配内存,所以如果做赋值操作,在汇编级别你会发现会比分配内存还要消耗CPU,因为首先要将要赋的值拷贝到寄存器,然后再从寄存器复制到堆栈指针指定的内存地址中。

由于编译器为了效率没有对局部变量赋默认值,那么不对局部变量赋值就使用,将导致不可预料的结果,所以编译器给出错误让代码编写者改正。

 

变量看在哪里,比如你放进了类中定义注意不是方法内部的局部变量,而是类的一个成员,这时候,你写了int i;那么当你new这个类的对象时候,你知道吗,现在在托管堆创建这个对象,那么你定义的这个i被初始化为0,那为什么出现你说的局部变量呢,注意这里局部变量包括值类型和引用类型,局部变量是运行时刻在堆栈存放的,那么这个时候,变量不被初始化。记住,一个变量是不是clr给默认值,关键你看它的位置,在托管堆就可以,不在就不行。

 

 

char 它只能存储编码为一个数的文本字符,及16位或者两字节,它是值类型

string 它可以存储从无字符(空字符串) 到任何多字符,它不能存储在堆栈中(堆栈有固定的长度很容易被填满),再所以他是引用类型,它的引用被存储在堆栈中,而值方在堆中.

 

bool :它的值只能是true和false,在c#中ture和false不能用0或1表示.

 

 

代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class Default6 : System.Web.UI.Page
{
    
protected void Page_Load(object sender, EventArgs e)
    {
        
//申明方式
        DateTime dt;

        
//赋值
        dt = DateTime.Now;

        
//申明一个固定的时间,转换为:mm/dd/yy
        DateTime dat = Convert.ToDateTime("9/6/2009");

        
//看下它的类型 
        Response.Write(dat.GetType().ToString()+"<br>");

        
//简单看下它的使用
        Response.Write("年:"+dt.Year+"<br>");
        Response.Write(
"月:" + dt.Month + "<br>");
        Response.Write(
"日:" + dt.Day + "<br>");

        Response.Write(
"长日期格式:"+dt.ToLongDateString()+"<br>");
        Response.Write(
"长时间格式:"+dt.ToLongTimeString()+"<br>");
        Response.Write(
"短日期格式:"+dt.ToShortDateString()+"<br>");
        Response.Write(
"短时间格式:"+dt.ToShortTimeString()+"<br>");
    }
}

 

 

 

          int c = 888;
          int? cc = null;
          cc 非空则为cc,否则为c
          Response.Write(cc ?? c);

 

代码
 /*int型计算是不带小数点的,如果在+,-,*,/
        * 运算中得到的值有小数点,则小数点会被忽略.
        * 如果将double类型强制转换为int类型,那么小数点
        * 也会被忽略.所以算钱不会用int,一般用Decimal来
        * 处理货币计算.
        * MSDN:
        * decimal 关键字表示 128 位数据类型。同浮点型相比,
        * decimal 类型具有更高的精度和更小的范围,这使它适合于财务
        * 和货币计算。decimal 类型的大致范围和精度如下表所示。
        
*/

        
int gz = 160;//设置每天工资为160元

        
double jgz = 25.6//加班工资为35.6元/小时

        
int dy = 26//设置上班天数

        
double hos = 38.5//设置加班时间38.5

        gz 
*= 26;
        
//算出该月工资
        Response.Write("实际工资为:" + gz);
        Response.Write(
"<br>");
        jgz 
*= hos;
        
//算出全部加班工资
        Response.Write("加班工资为:" + jgz);
        Response.Write(
"<br>");
        
//算出这个月得到的总工资
        jgz += gz;
        Response.Write(
"总工资:" + jgz);

 

 

代码
int a = 23
        
//显示转换
        byte b = Convert.ToByte(a);
        Response.Write(b
+"<br>");
       
        
byte d = 43;
        
//隐式转换,也叫自动类型转换
        int f = d;

        
double r = 342.723;
        
//将浮点型转换为整型,会被去除小数,并舍五入
        int u = Convert.ToInt32(r);
        Response.Write(u 
+ "<br>");

        Decimal q 
= 154354324243.428732432543m;
        
//Decimal转换为double,会被四舍五入,并保留三位小数
        double x = Convert.ToDouble(q);
        
//这里使用Math.Round方法让小数点保留两位.
        Response.Write(Math.Round(x,2)+"<br>");

        
uint ui = 100;
        
//强制类型转换
        int i = (int)ui;

 

 

 

posted @ 2009-12-03 22:31  唔愛吃蘋果  阅读(707)  评论(0编辑  收藏  举报