C#常量和编程实例

来源:互联网 发布:如何培养职业道德知乎 编辑:程序博客网 时间:2024/06/06 04:44
C#常量

一 

常量是在编译时已知并在程序的生存期内不发生更改的不可变值。 常量使用 const 修饰符进行声明。 只有 C# 内置类型(System.Object 除外)可以声明为 const。 
用户定义的类型(包括类、结构和数组)不能为 const。 请使用 readonly 修饰符创建在运行时初始化一次即不可再更改的类、结构或数组。
C# 不支持 const 方法、属性或事件。
可以使用枚举类型为整数内置类型(例如 int、uint、long 等等)定义命名常量。 参见 enum。
常量必须在声明时初始化。 例如:

class Calendar1
{
    public const int months = 12;
}


当编译器遇到 C# 源代码(例如 months)中的常量修饰符时,将直接把文本值替换到它生成的中间语言 (IL) 代码中。 因为在运行时没有与常量关联的变量地址,所以 const 字段不能通过引用传递,并且不能在表达式中作为左值出现。

当引用在其他代码如 DLL 中定义的常量值时应十分谨慎。 如果新版本的 DLL 为常量定义了新的值,程序仍将保留旧的文本值,直到针对新版本重新编译程序。

可以同时声明多个相同类型的常量,例如:

class Calendar2
{
    const int months = 12, weeks = 52, days = 365;
}

如果不会造成循环引用,用于初始化一个常量的表达式可以引用另一个常量。 例如:

class Calendar3
{
    const int months = 12;
    const int weeks = 52;
    const int days = 365;

    const double daysPerWeek = (double) days / (double) weeks;
    const double daysPerMonth = (double) days / (double) months;
}

常量可标记为 public、private、protected、internal 或 protectedinternal。 这些访问修饰符定义类的用户访问该常量的方式。 
因为常量值对该类型的所有实例是相同的,所以常量被当作 static 字段一样访问。 不使用 static 关键字声明常量。 未包含在定义常量的类中的表达式必须使用类名、一个句点和常量名来访问该常量。 例如:
int birthstones = Calendar.months;

2
在程序中使用常量至少有3个好处:
a.常量用易于理解的清楚的名称替代了含义不明确的数字或字符串,使程序更易于阅读。
b.常量使程序更易于修改。例如,在C#程序中有一个SalesTax常量,该常量的值为6%。如果以后销售税率发生变化,把新值赋给这个常量,就可以修改所有的税款计算结果,而不必查找整个程序,修改税率为0.06的每个项。
C.常量更容易避免程序出现错误。如果要把另一个值赋给程序中的一个常量,而该常量已经有了一个值,编译器就会报告错误。

在C#中定义常量的方式有两种,一种叫做静态常量(Compile-time constant),另一种叫做动态常量(Runtime constant)。前者用“const”来定义,后者用“readonly”来定义。

3
有const 的都是常量
const int a=3; 就是常量 
常量赋值后不可以修改。 常量 一般用于 经常使用的变量而且是全局的
常量是在编译时设置其值并且永远不能更改其值的字段。 

定义浮点型时,用float,不过后面要加个F,
float x = 1.2356f;
Console.Write(x);

字符常量是括在单引号里,例如,'x',且可存储在一个简单的字符类型变量中。一个字符常量可以是一个普通字符(例如 'x')、一个转义序列(例如 '\t')或者一个通用字符(例如 '\u02C0')。
在 C# 中有一些特定的字符,当它们的前面带有反斜杠时有特殊的意义,可用于表示换行符(\n)或制表符 tab(\t)。

二 编程实例
1
using System;

namespace DeclaringConstants
{
    class Program
    {
        static void Main(string[] args)
        {
            const double pi = 3.14159; // 常量声明
            double r;
            Console.WriteLine("输入半径: ");
            r = Convert.ToDouble(Console.ReadLine());
            double areaCircle = pi * r * r;
            Console.WriteLine("半径: {0}, 面积: {1}", r, areaCircle);
            
            Console.Write("按任意键继续 . . . ");
Console.ReadKey(true);
    }
}
}

2
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace changliang
{
    public sealed class SomeLibraryType
    {
      public const Int32 MaxEntriesInList=50 ; 


        //可以同时声明多个常量
     public const Int32 month = 12, weeks = 52, days = 365;


        //如果不会造成循环引用,用于初始化一个常量的表达式可以引用另一个常量
     const double daysPerWeek = (double)days / weeks;
        const double daysPerMonth = (double)days / month;   
    }


class Program
    {
        static void Main(string[] args)
        {
            //这说明了常量的调用方式
       Console.WriteLine(SomeLibraryType.MaxEntriesInList);
             
            //不允许修改常量的值
       //常量的版本控制问题,只有重新编译,常量值才会获得新值,如果在运行时,如果一个程
       //序集要从另外1个程序集获得新值,那么不能使用常量,应该使用字段。
       //SomeLibraryType.MaxEntriesInList = 4;
       
       Console.Write("按任意键继续 . . . ");
Console.ReadKey(true);
        }
    }
}


using System;

static class Constants
{
    public const double Pi = 3.14159;
    public const int SpeedOfLight = 300000; // km per sec.


}
class Program
{
    static void Main()
    {
        double radius = 5.3;
        double area = Constants.Pi * (radius * radius);
        int secsFromSun = 149476000 / Constants.SpeedOfLight; // in km
        
        Console.Write(area);
        Console.Write("\n");
        Console.Write(secsFromSun);
        Console.Write("\n");
        
        Console.Write("按任意键继续 . . . ");
Console.ReadKey(true);
    }
}

4 转义字符常量示例
using System;

namespace EscapeChar
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello\tWorld\n\n");
            
            Console.Write("按任意键继续 . . . ");
    Console.ReadKey(true);
        }
    }

}

上述代码的运行截图:








0 0
原创粉丝点击