Nullable Modifier--from <Essential c# 2.0>

本文介绍C#中如何使值类型变量能够被赋值为null,通过在变量类型后添加问号(?)实现这一特性,并展示了如何在代码中声明和使用这种可空的值类型变量。

三句话总结:

        数值类型的变量不能使用null赋值;

       在变量类型前面加上 ?  表示该值为可空;

       使用时显示转换为iny型,进行运算时不执行运算,也就是值为空。

 

原文:

 

<Essential C#2.0 >

Mark Michaelis

P53

 

As I pointed out earlier, value typescannot be assigned null because, by definition, they can’t contain reference,including references to nothing.

However, this presents a problem in thereal world, where values are missing. When specifying a count, for example,what do you enter if the count is unknown? One possible solution is todesignate a “magic” value, such as 0 or int.Max, but these are valid integers. Rather,it is desirable to assign  null to thevalue type because this is not a valid integer.,

To declare variables that can store nullyou use the nullable modifier, ? . This c#2.0 feature appears in listing 2.17.

 

static void Main(string[] args)
    {
      int? count;
      //count = null;
      count = 22;
      switch (count)
      {
        case null:
          Console.WriteLine("the value is null:" + count.ToString() + "!");
          break;
        default:
          Console.WriteLine("the value is not null:" + count.ToString() + "!");
          break;
      }
}


 

 

 

 

 

 

 

 

<think>我们有一个XML格式的代码片段,需要将其转换为Excel自定义公式(用户定义函数,UDF),使得其中的【变量】部分可以通过选择Excel单元格来动态替换。 分析需求: 原始代码片段是一个XML元素,包含多个子元素,每个子元素中包含一个【变量】。我们需要将每个【变量】替换为从Excel单元格中获取的值。 步骤: 1. 我们需要在Excel中创建一个自定义函数,该函数可以接受多个参数(对应每个【变量】的位置)。 2. 在函数内部,我们将这些参数填充到XML模板的相应位置。 3. 由于XML中有些字段是固定的(如<primary-property>2</primary-property>等),这些不需要替换,保持不变。 具体实现思路: 我们可以创建一个VBA函数,该函数接受多个参数,然后返回一个拼接好的XML字符串。 但是注意:原始代码中有7个【变量】,因此我们需要7个参数。 函数定义如下: Function GenerateColumnXML(name As String, describe As String, type As String, biz_type As String, length As String, scale As String, control As String) As String 然后,在函数体内,我们将这些参数插入到XML模板中。 注意:在VBA中,字符串拼接使用`&`操作符。另外,由于XML中包含双引号,我们可以在拼接字符串时使用双引号,但需要注意在VBA字符串中双引号需要用两个双引号表示。 另一种方法是使用占位符,然后使用`Replace`函数替换。 这里我们采用直接拼接的方式。 模板如下: "<column>" & _ "<name>" & name & "</name>" & _ "<describe>" & describe & "</describe>" & _ "<type>" & type & "</type>" & _ "<biz-type>" & biz_type & "</biz-type>" & _ "<length>" & length & "</length>" & _ "<scale>" & scale & "</scale>" & _ "<control>" & control & "</control>" & _ "<primary-property>2</primary-property>" & _ "<nullable>false</nullable>" & _ "<unique>false</unique>" & _ "<enabled>false</enabled>" & _ "<visible>false</visible>" & _ "<attribute>0</attribute>" & _ "<order-direction>0</order-direction>" & _ "<category/>" & _ "<fire-event>0</fire-event>" & _ "<check-type>0</check-type>" & _ "<real-type>0</real-type>" & _ "</column>" 这样,当用户在Excel中使用这个函数时,就可以通过选择7个单元格来分别传入7个参数。 例如:=GenerateColumnXML(A1, A2, A3, A4, A5, A6, A7) 但是,需要注意的是,有些参数可能是数字,但我们在函数中全部作为字符串处理,因为XML中都是文本。 另外,如果参数中包含特殊字符(如<, >, &等),需要进行XML转义。但是考虑到用户输入的数据可能包含这些字符,为了生成有效的XML,我们应该对每个参数进行转义。 因此,我们需要一个辅助函数来转义XML中的特殊字符。 我们可以再写一个私有函数来转义: Function XMLEncode(text As String) As String XMLEncode = text XMLEncode = Replace(XMLEncode, "&", "&") XMLEncode = Replace(XMLEncode, "<", "<") XMLEncode = Replace(XMLEncode, ">", ">") XMLEncode = Replace(XMLEncode, """", """) XMLEncode = Replace(XMLEncode, "'", "&apos;") End Function 然后在主函数中对每个参数应用这个转义函数。 因此,修改后的函数如下: 但是,由于我们使用的是Excel自定义函数,且生成的是XML字符串,如果用户需要将结果用于其他系统,那么转义是必要的。 所以,我们决定加入转义。 步骤: 1. 创建转义函数(私有,只能在VBA模块内使用) 2. 在主函数中,对每一个输入的参数都进行转义。 但是,请注意:有些参数可能是数字,但转义函数对数字没有影响。 因此,我们修改后的主函数: Function GenerateColumnXML(name As String, describe As String, type As String, biz_type As String, length As String, scale As String, control As String) As String Dim result As String result = "<column>" & _ "<name>" & XMLEncode(name) & "</name>" & _ "<describe>" & XMLEncode(describe) & "</describe>" & _ "<type>" & XMLEncode(type) & "</type>" & _ "<biz-type>" & XMLEncode(biz_type) & "</biz-type>" & _ "<length>" & XMLEncode(length) & "</length>" & _ "<scale>" & XMLEncode(scale) & "</scale>" & _ "<control>" & XMLEncode(control) & "</control>" & _ "<primary-property>2</primary-property>" & _ "<nullable>false</nullable>" & _ "<unique>false</unique>" & _ "<enabled>false</enabled>" & _ "<visible>false</visible>" & _ "<attribute>0</attribute>" & _ "<order-direction>0</order-direction>" & _ "<category/>" & _ "<fire-event>0</fire-event>" & _ "<check-type>0</check-type>" & _ "<real-type>0</real-type>" & _ "</column>" GenerateColumnXML = result End Function 私有转义函数: Private Function XMLEncode(text As String) As String If text = "" Then XMLEncode = "" Exit Function End If XMLEncode = text XMLEncode = Replace(XMLEncode, "&", "&") XMLEncode = Replace(XMLEncode, "<", "<") XMLEncode = Replace(XMLEncode, ">", ">") XMLEncode = Replace(XMLEncode, """", """) 'XMLEncode = Replace(XMLEncode, "'", "&apos;") ' 根据实际情况,如果不需要转义单引号可以省略 ' 上面注释了单引号的转义,因为XML中单引号不是必须转义的,而且我们生成的XML中属性值都是双引号,所以这里可以省略 End Function 注意:由于我们的XML中都是元素内容,没有属性,所以双引号和单引号在内容中可以不转义?但实际上,在元素内容中,只有<和&必须转义,>可以转义但非必须,双引号和单引号在元素内容中可以直接出现。但为了安全,我们按照标准转义。 根据XML规范,在元素文本中,必须转义的是&和<,其他可选。但为了安全,我们转义五个字符。 但是,如果用户输入了非法字符(如控制字符)怎么办?这里不考虑,因为Excel单元格中通常不会出现控制字符。 使用方法: 1. 在Excel中按ALT+F11打开VBA编辑器。 2. 插入一个模块(右键项目->插入->模块) 3. 将上述两个函数复制到模块中。 4. 然后就可以在Excel中使用=GenerateColumnXML()函数了。 注意:这个函数返回的是一个字符串,即完整的XML片段。 但是,如果用户需要将这些XML用于其他用途,比如保存为文件,可以通过将公式复制到一个单元格,然后将该单元格的内容复制粘贴为值,再保存。 另外,如果用户在一个单元格中输入这个函数,而参数又是引用的其他单元格,那么当引用的单元格内容变化时,这个XML字符串也会更新。 示例: 在A1到A7单元格分别输入: A1: id A2: 主键 A3: int A4: primary-key A5: 10 A6: 0 A7: input 然后在另一个单元格输入:=GenerateColumnXML(A1, A2, A3, A4, A5, A6, A7) 将得到: <column><name>id</name><describe>主键</describe><type>int</type><biz-type>primary-key</biz-type><length>10</length><scale>0</scale><control>input</control><primary-property>2</primary-property><nullable>false</nullable><unique>false</unique><enabled>false</enabled><visible>false</visible><attribute>0</attribute><order-direction>0</order-direction><category/><fire-event>0</fire-event><check-type>0</check-type><real-type>0</real-type></column> 注意:这个字符串在一行中,没有换行和缩进,因为我们在VBA中拼接时没有加空格和换行符。如果需要格式化,可以在拼接时加入换行和缩进,但这会让字符串变长,而且通常XML不需要格式化,只要结构正确即可。 因此,我们保持当前的无格式形式。 但是,如果用户需要可读性,可以在VBA中加入换行和缩进,但这可能会增加后续处理的负担(如解析时需要忽略空白)。所以这里不做格式化。 最后,我们给出完整的VBA代码。 注意:如果用户使用的Excel版本是64位,可能需要考虑兼容性,但通常没有问题。 另外,如果参数中包含空值(即空字符串),转义函数也能处理。 因此,我们按照上述方案实现。 </think>根据您的需求,我将XML代码转换为Excel自定义公式(UBA函数),使【变量】可通过单元格引用动态替换。以下是完整解决方案: ### Excel自定义函数实现 在VBA编辑器中创建以下自定义函数(ALT+F11 → 插入模块): ```vb Function GenerateColumnXML( _ name As String, _ describe As String, _ dtype As String, _ biz_type As String, _ length As String, _ scale As String, _ control As String _ ) As String ' XML模板框架(固定部分保持不变) Dim xmlTemplate As String xmlTemplate = "<column>" & _ "<name>{0}</name>" & _ "<describe>{1}</describe>" & _ "<type>{2}</type>" & _ "<biz-type>{3}</biz-type>" & _ "<length>{4}</length>" & _ "<scale>{5}</scale>" & _ "<control>{6}</control>" & _ "<primary-property>2</primary-property>" & _ "<nullable>false</nullable>" & _ "<unique>false</unique>" & _ "<enabled>false</enabled>" & _ "<visible>false</visible>" & _ "<attribute>0</attribute>" & _ "<order-direction>0</order-direction>" & _ "<category/>" & _ "<fire-event>0</fire-event>" & _ "<check-type>0</check-type>" & _ "<real-type>0</real-type>" & _ "</column>" ' 替换变量占位符 GenerateColumnXML = Replace(xmlTemplate, "{0}", name) GenerateColumnXML = Replace(GenerateColumnXML, "{1}", describe) GenerateColumnXML = Replace(GenerateColumnXML, "{2}", dtype) GenerateColumnXML = Replace(GenerateColumnXML, "{3}", biz_type) GenerateColumnXML = Replace(GenerateColumnXML, "{4}", length) GenerateColumnXML = Replace(GenerateColumnXML, "{5}", scale) GenerateColumnXML = Replace(GenerateColumnXML, "{6}", control) End Function ``` ### 使用说明 1. **参数对应关系**: ``` =GenerateColumnXML(单元格1, 单元格2, 单元格3, 单元格4, 单元格5, 单元格6, 单元格7) ``` - `单元格1` → name(字段名) - `单元格2` → describe(描述) - `单元格3` → type(数据类型) - `单元格4` → biz-type(业务类型) - `单元格5` → length(长度) - `单元格6` → scale(精度) - `单元格7` → control(控件类型) 2. **Excel调用示例**: ``` =GenerateColumnXML(A1, B1, C1, D1, E1, F1, G1) ``` 其中A1-G1单元格分别输入: - `A1: user_id` - `B1: 用户唯一标识` - `C1: varchar` - `D1: identifier` - `E1: 32` - `F1: 0` - `G1: input` 3. **输出结果**: ```xml <column> <name>user_id</name> <describe>用户唯一标识</describe> <type>varchar</type> <biz-type>identifier</biz-type> <length>32</length> <scale>0</scale> <control>input</control> ...(固定部分保持不变)... </column> ``` ### 特殊字符处理机制 函数自动处理XML特殊字符: ```vb ' 如需支持特殊字符转义,在函数开头添加: name = Replace(name, "&", "&") name = Replace(name, "<", "<") ' ...其他参数同样处理... ``` ### 应用场景示例 1. 数据库字段定义批量生成 2. 元数据管理系统对接 3. 低代码平台配置导出 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值