C#中字符串插值($) 和 逐字字符串(@)的使用

 更新时间:2025年11月04日 10:29:49   作者:爱吃巧克力的程序媛  
这篇文章主要介绍了C#中字符串插值($) 和 逐字字符串(@)的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

这段代码使用了 C# 的 字符串插值($逐字字符串(@ 功能,并在 SQL 语句中动态拼接变量。下面详细解释它们的用法:

1.$(字符串插值)

$ 是 C# 的 字符串插值 符号,允许在字符串中直接嵌入表达式(用 {} 包裹),例如:

string name = "Alice";
string message = $"Hello, {name}!"; // 输出:Hello, Alice!

在 SQL 语句中,$ 用于动态插入变量值,如 {level}{GetNextSortOrder(parentId)} 等。

2.@(逐字字符串)

@ 是 C# 的 逐字字符串 符号,它会:

  • 忽略转义字符(如 \n\t 等)
  • 允许字符串跨多行(适合 SQL 语句)
  • 保留所有空格和换行

例如:

string sql = @"
    SELECT *
    FROM Users
    WHERE Id = 1";

如果不加 @,换行符需要用 \n 表示,而加了 @ 后可以直接换行。

3.$@(同时使用)

$@ 结合了两种功能:

  • @ 允许 SQL 语句跨多行
  • $ 允许在字符串中插入变量

所以:

string strsql = $@"
    INSERT INTO System 
    (PID, Level, SortOrder, Name, remark, CreatedTime, ModifiedTime)
    VALUES (...)
";

这样既保持了 SQL 语句的可读性,又能动态插入变量。

4.{(level == 3 ? $"'{editForm.Target.Replace("'", "''")}'" : "NULL")}解释

这段代码是一个 嵌套的三元运算符 + 字符串插值,用于动态生成 SQL 语句中的 remark 字段值:

  • level == 3:检查当前节点是否是第 3 级(可能是菜单项)
    • 如果是,则:
      • editForm.remark.Replace("'", "''"):对 remark 字符串进行 SQL 转义(单引号 ' 替换成 '',防止 SQL 注入)
      • $"'{...}'":用单引号包裹(因为 SQL 字符串需要用 ' 括起来)
    • 如果不是(level != 3),则直接插入 NULL(SQL 的 NULL 值,不加引号)

示例

假设:

  • level = 3
  • editForm.remark= "admin/home"

则生成的 SQL 部分:

remark= 'admin/home'

如果 level = 2,则:

remark= NULL

5. 完整 SQL 拼接示例

假设:

  • parentId = 1
  • level = 3
  • editForm.NodeName = "Admin Page"
  • editForm.remark = "admin/home"

生成的 SQL 语句:

INSERT INTO System
(PID, Level, SortOrder, Name, remark, CreatedTime, ModifiedTime)
VALUES (
    1,
    3,
    1,  -- 假设 GetNextSortOrder(parentId) 返回 1
    'Admin Page',
    'admin/home',
    GETDATE(),
    GETDATE()
)

6. 安全性注意事项

虽然这种拼接方式方便,但存在 SQL 注入风险(如果 NodeNameTarget 等来自用户输入)。更安全的方式是使用 参数化查询(如 SqlCommand.Parameters):

using (var cmd = new SqlCommand(
    @"INSERT INTO System 
       (PID, Level, SortOrder, Name, remark, CreatedTime, ModifiedTime)
       VALUES (@PID, @Level, @SortOrder, @Name, @remark, GETDATE(), GETDATE())", 
    connection))
{
    cmd.Parameters.AddWithValue("@PID", parentId ?? (object)DBNull.Value);
    cmd.Parameters.AddWithValue("@Level", level);
    cmd.Parameters.AddWithValue("@SortOrder", GetNextSortOrder(parentId));
    cmd.Parameters.AddWithValue("@Name", editForm.NodeName);
    cmd.Parameters.AddWithValue("@remark", level == 3 ? editForm.Target : (object)DBNull.Value);
    cmd.ExecuteNonQuery();
}

这样可以有效防止 SQL 注入攻击。

到此这篇关于C#中字符串插值($) 和 逐字字符串(@)的使用的文章就介绍到这了,更多相关C# 字符串插值 和 逐字字符串内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • c# in depth的泛型实现实例代码

    c# in depth的泛型实现实例代码

    这篇文章主要介绍了c# in depth的泛型实现实例代码,学C#的同学一定会用到泛型实现的,这里我们提供了泛型实现的程序代码,大家参考使用
    2013-11-11
  • C#的winform如何嵌套另一个exe程序

    C#的winform如何嵌套另一个exe程序

    这篇文章主要介绍了C#的winform如何嵌套另一个exe程序问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • c#字符串去掉空格的二种方法(去掉两端空格)

    c#字符串去掉空格的二种方法(去掉两端空格)

    本文主要介绍了字符串去掉两端空格,并且将字符串中多个空格替换成一个空格的方法,需要的朋友可以参考下
    2014-02-02
  • C#多线程之任务的用法详解

    C#多线程之任务的用法详解

    本文详细讲解了C#多线程之任务的用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • C#中科学绘图库ScottPlot的使用详解

    C#中科学绘图库ScottPlot的使用详解

    ScottPlot是基于.Net的一款开源免费的交互式可视化库,支持Winform和WPF等UI框架,本文给大家介绍了C#中科学绘图库ScottPlot的使用方法,文中示例在WPF环境中运行,需要的朋友可以参考下
    2023-12-12
  • WPF实现动画效果(三)之时间线(TimeLine)

    WPF实现动画效果(三)之时间线(TimeLine)

    这篇文章介绍了WPF实现动画效果之时间线(TimeLine),对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • C#使用正则表达式实现首字母转大写的方法

    C#使用正则表达式实现首字母转大写的方法

    这篇文章主要介绍了C#使用正则表达式实现首字母转大写的方法,涉及C#基于正则表达式操作字符串的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-11-11
  • c#使用简单工厂模式实现生成html文件的封装类分享

    c#使用简单工厂模式实现生成html文件的封装类分享

    这篇文章主要介绍了运用了简单工厂模式实现页面静态化封装类,思路比较简单,大家可根据自己的思路再扩展此类
    2014-01-01
  • 基于C#实现文档打印功能

    基于C#实现文档打印功能

    在软件开发过程中,文档打印是一个常见的功能需求,本文将详细介绍如何在C#中实现文档打印,并通过代码示例介绍的非常详细,对大家的学习或工作有一定帮助,需要的朋友可以参考下
    2024-10-10
  • Unity实现绕任意轴任意角度旋转向量

    Unity实现绕任意轴任意角度旋转向量

    这篇文章主要为大家详细介绍了Unity实现绕任意轴任意角度旋转向量,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-01-01

最新评论