服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C#中变量、常量、枚举、预处理器指令知多少

C#中变量、常量、枚举、预处理器指令知多少

2021-12-31 13:37Simen.Net C#

这篇文章主要介绍了c#共有其中变量类型有:静态变量、实类变量、数组元素、数值参数、引用参数、输出参数和局部变量,需要的朋友可以参考一下

一、变量

c#共有其中变量类型有:静态变量、实类变量、数组元素、数值参数、引用参数、输出参数和局部变量

先定义一个简单的类来说明,如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class variabledefine
  {
    private static uint variableuint;
    public static uint variableuint { get => variableuint; set => variableuint = value; }
    string variablestr;
    public variabledefine(string version)
    {
      variablestr = version;
    }
 
    public static void fun()
    
      console.writeline(variableuint);
    }
 
    /// <summary>
    /// 变量类型
    /// </summary>
    /// <param name="intarray">intarray[0]数组元素</param>
    /// <param name="a">数值参数</param>
    /// <param name="b">引用类型</param>
    /// <param name="c">输出参数</param>
    public void fun(int[] intarray, int a, ref int b, out int c)
    {
      //局部变量i
      var i = 0;
      c = i;
    }
  }

对于静态变量在被创建加载之后失效,当被卸载后失效,静态变量的初始值也为此类型的变量的默认值

对于实例变量当创建某类的一个实例的时候,隶属于该类的实例变量也被生成,当不再有关于这个实例的引用而且实例的析构函数执行了以后,此实例变量失效

对于数组元素当任意一个数组实例被创建时,这个数组的元素也被同时创建,当不再有任何正对这个数组实例的引用时,它的元素也就此失效

当一个不带有ref 或out 修饰参数被声明时,我们称它为数值参数

参数当一个带有ref 修饰语的参数被声明时,我们称之为引用参数

参数当一个带有out 修饰语的参数被声明时,我们称之为输出参数

局部变量被局部变量声明语句创建

c#编译器不容许在表达式中使用未初始化的变量

变量初始化要注意两点的是:(1)变量是类或结构中的字段,如果没有显示初始化,创建这些变量时,其默认值就是0(2)方法的局部变量必须在代码中显示初始化,之后才能在语句中使用它们的值。

二、常量

c#可以定义两种类型的常量,静态常量用const来定义在程序编译的时候确定,一种是动态常量用readonly来定义在运行时确定

静态常量使用方便,性能高,但一旦定义之后就不可以改变,在一个引用第三方程序集上面如果定义了一个静态常量,当它定义的值改变时你不得不重新引用生成主程序

动态常量使用灵活,能很好的支持程序的扩展性

下面一个事例就是通过读取xml文档来给动态常量赋值

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public sealed class readonlymodel
  {
    public readonly list<company> listcompany;
    public readonlymodel(string companyinfopath)
    {
      xelement companys = xelement.load(companyinfopath);
      var elements = from e in companys.elements("company")
              where e.element("name").value.equals("c#")
              select e;
      listcompany = getlistcompany(elements);
    }
 
    /// <summary>
    /// 解析xml文档
    /// </summary>
    /// <param name="elements"></param>
    /// <returns></returns>
    private list<company> getlistcompany(ienumerable<xelement>elements)
    {
      var listcompany = new list<company>();
      foreach (var element in elements)
      {
        var companymodel = new company()
        {
          companyname = element.element("name").value,
          companyemail = element.element("email").value
        };
        listcompany.add(companymodel);
      }
      return listcompany;
    }
  }

根据传入的路径来解析xml文件赋值给动态常量,能很好的扩展应用程序的常量值

三、枚举

枚举是用户定义的整数类型,在声明一个枚举时,要指定该枚举的实例可以包含的一组可以接受的值,枚举具有如下的优势:

1.枚举可以使代码更易于维护,有助于确定给变量指定合法的,期望的值

2.枚举使代码更清晰,允许用描述性的名称来表示整数,而不是含义模糊、变化多端的数

3.枚举也是代码更易于输入

在实际应用中通常在枚举上面加上description需要显示的枚举特性值,在页面显示的时候通常显示的也是枚举的特性值,所以有必要写一个获取枚举特性值的通用方法

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
class program
  {
    static void main(string[] args)
    {
      //readonlymodel readonlycompany = new readonlymodel(@"d:\githubproject\c#advancedprogramming\variabledefine\variabledefine\bin\debug\test-parking-sn.xml"); //c:\program files(x86)\fponline
      //foreach (var company in readonlycompany.listcompany)
      //{
      //  console.writeline("company name is {0} company email is {1}", company.companyname, company.companyemail);
      //}
      //console.writeline("company name is {0} company email is {1}", constclass.companyname, constclass.companyemail);
      memberlevel supermember = memberlevel.supermember;
      console.writeline(supermember.getdescriptionenum());
      console.readkey();
    }
  }
 
  public enum memberlevel
  {
    [description("超级会员")]
    supermember=1,
    [description("一般会员")]
    member=2,
    [description("普通用户")]
    generaluser=3
  }
 
  public static class enumextension
  {
    public static string getdescriptionenum(this enum enumvalue)
    {
      descriptionattribute attr = null;
      var enumtype = enumvalue.gettype();
      string name = enum.getname(enumtype, enumvalue);
      if (name != null)
      {
        fieldinfo fieldinfo = enumtype.getfield(name);
        if (fieldinfo != null)
          attr = attribute.getcustomattribute(fieldinfo, typeof(descriptionattribute), false) as descriptionattribute;
      }
      if (attr != null && !string.isnullorempty(attr.description))
        return attr.description;
      else return string.empty;
    }
  }

参考博客:枚举知多少

四、c#的预处理指令

使用预处理指令可以禁止编译器编译与额外功能相关的代码,以控制不同版本拥有的功能,如企业版和基本版本

#define(给定名称的符号)和#undef(删除名称的符号)一般与#if、#elif、#else、#endif结合起来使用如

C#中变量、常量、枚举、预处理器指令知多少

没有找到预定义的debug就不会执行 #if和#endif代码块里面的语句,这也称为条件编译。

同样的预处理器指令有:#warning和#error,当编译器遇到它们时,会分别产生警告或错误,如果编译器遇到#warning指令,会给用户显示#warning后面的文本,之后编译继续,如果编译器遇到#error指令,就会给用户显示后面的文本,作为一条编译错误消息,然后立即退出编译。

#region和#endregion指令用于把一段代码标记为有给定名称的一个块,#line指令用于改变编译器在警告和错误信息中显示的文件名和行号信息,#pragm可以印制或还原指定的编译警告参考:https://msdn.microsoft.com/zh-cn/library/yt3yck0x.aspx

原文链接:http://www.cnblogs.com/simen-tan/p/Simen-Net.html

延伸 · 阅读

精彩推荐
  • C#C#微信公众号与订阅号接口开发示例代码

    C#微信公众号与订阅号接口开发示例代码

    这篇文章主要介绍了C#微信公众号与订阅号接口开发示例代码,结合实例形式简单分析了C#针对微信接口的调用与处理技巧,需要的朋友可以参考下...

    smartsmile20127762021-11-25
  • C#深入理解C#的数组

    深入理解C#的数组

    本篇文章主要介绍了C#的数组,数组是一种数据结构,详细的介绍了数组的声明和访问等,有兴趣的可以了解一下。...

    佳园9492021-12-10
  • C#三十分钟快速掌握C# 6.0知识点

    三十分钟快速掌握C# 6.0知识点

    这篇文章主要介绍了C# 6.0的相关知识点,文中介绍的非常详细,通过这篇文字可以让大家在三十分钟内快速的掌握C# 6.0,需要的朋友可以参考借鉴,下面来...

    雨夜潇湘8272021-12-28
  • C#VS2012 程序打包部署图文详解

    VS2012 程序打包部署图文详解

    VS2012虽然没有集成打包工具,但它为我们提供了下载的端口,需要我们手动安装一个插件InstallShield。网上有很多第三方的打包工具,但为什么偏要使用微软...

    张信秀7712021-12-15
  • C#利用C#实现网络爬虫

    利用C#实现网络爬虫

    这篇文章主要介绍了利用C#实现网络爬虫,完整的介绍了C#实现网络爬虫详细过程,感兴趣的小伙伴们可以参考一下...

    C#教程网11852021-11-16
  • C#C#设计模式之Strategy策略模式解决007大破密码危机问题示例

    C#设计模式之Strategy策略模式解决007大破密码危机问题示例

    这篇文章主要介绍了C#设计模式之Strategy策略模式解决007大破密码危机问题,简单描述了策略模式的定义并结合加密解密算法实例分析了C#策略模式的具体使用...

    GhostRider10972022-01-21
  • C#SQLite在C#中的安装与操作技巧

    SQLite在C#中的安装与操作技巧

    SQLite,是一款轻型的数据库,用于本地的数据储存。其优点有很多,下面通过本文给大家介绍SQLite在C#中的安装与操作技巧,感兴趣的的朋友参考下吧...

    蓝曈魅11162022-01-20
  • C#如何使用C#将Tensorflow训练的.pb文件用在生产环境详解

    如何使用C#将Tensorflow训练的.pb文件用在生产环境详解

    这篇文章主要给大家介绍了关于如何使用C#将Tensorflow训练的.pb文件用在生产环境的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴...

    bbird201811792022-03-05