C# 使逐字字符串文本自动缩进,以与附近的代码保持一致

C# 使逐字字符串文本自动缩进,以与附近的代码保持一致,c#,string,visual-studio-2013,auto-indent,autoformatting,C#,String,Visual Studio 2013,Auto Indent,Autoformatting,在C#中,我经常使用逐字字符串文本(例如,@“Arrr!”)在保留布局的同时跨多行打断长字符串。例如,我使用它分解内联SQL,如下所示: var sqlString = @" SELECT Column1 , ... FROM Table1 INNER JOIN ... WHERE Column2 = @Value2 , ... "; var regexPattern = @"

在C#中,我经常使用逐字字符串文本(例如,
@“Arrr!”
)在保留布局的同时跨多行打断长字符串。例如,我使用它分解内联SQL,如下所示:

var sqlString = @" 
    SELECT 
        Column1
        , ...
    FROM
        Table1 INNER JOIN ...
    WHERE 
        Column2 = @Value2
        , ...
    ";
var regexPattern = @"
    (?<state>\w+)[.]?                       (?#*** Matches state {optionally having a period at the end} ***)
    (\s+|,|,\s+|\s*\u2022\s*)               (?#*** Matches space between state and zip {can include a comma or bullet point} ***)
    (?<zip>(\d{5}-\d{4}\b|\d{5}(?![\w-])))  (?#*** Matches zip code ***)
    ";
…或分解如下正则表达式模式:

var sqlString = @" 
    SELECT 
        Column1
        , ...
    FROM
        Table1 INNER JOIN ...
    WHERE 
        Column2 = @Value2
        , ...
    ";
var regexPattern = @"
    (?<state>\w+)[.]?                       (?#*** Matches state {optionally having a period at the end} ***)
    (\s+|,|,\s+|\s*\u2022\s*)               (?#*** Matches space between state and zip {can include a comma or bullet point} ***)
    (?<zip>(\d{5}-\d{4}\b|\d{5}(?![\w-])))  (?#*** Matches zip code ***)
    ";
在使用“如果”语句后:

if (true)
{
    if (maybe)
    {
        verbatim = @"       ___
    I likes my                 |
    strings purty              | no longer indented the way I like =(
    ";                      ___|
        fooBar = "nomnom";
    }
}

如何使Visual Studio自动缩进逐字字符串文字的行,就像它对周围的其他代码行所做的那样?

注释

  • 我不想在每一行上使用普通字符串并连接它们 所有这些都是这样的(我以前就是这样做的,但我发现 自由格式的逐字字符串文本更易于阅读和 修改):

  • 因为缩进多行逐字字符串文字会通过在每行的左侧添加新的空白来“增加字符串”,我意识到。如果在Visual Studio中全局设置此行为会缩进其他不应该缩进的逐字字符串文字,从而导致意外后果,那么是否有方法在代码中标记单个逐字字符串文字,使它们自动缩进,而所有其他文字则不自动缩进


通过更改“缩进”设置,我可以让VS2017以这种方式工作。我在工具->选项->文本编辑器->C#->选项卡。在该屏幕的顶部是一个标题为缩进的部分。将其从“智能”更改为“块”会产生类似于VS2010开箱即用的行为(至少对我而言)


我只是做了这个更改,所以我不确定对其他类型缩进的全部影响,但对于逐字字符串来说,它似乎是有效的。

我非常确定VS中没有任何内置内容允许这样做。您几乎必须编写某种类型的自定义插件。但是,您可以将字符串文字定义为常量变量,而这些常量变量不受实际使用位置格式的影响。您可以编写自己的VS扩展名来实现这一点。我怀疑VS是否内置了此功能。就我个人而言,我并不觉得手动高亮显示和制表很烦人。我没有一个好的答案,但是如果你将
+
移动到行尾,你可能会发现串联方法更可读。记住,使用的任何缩进空格都会变成,就像换行一样,字符串的一部分:因此没有内置任何以这种方式修改字符串的内容。@Richard True,正如我在文章末尾的第二个注释中提到的。但是,如果有某种方法可以将逐字字符串文字标记为“缩进的种类”,而将其他文字标记为“不缩进的种类”,那就太好了。也许现在没有这样的东西存在,但如果真的存在那就太好了!(像这样的帖子有时会导致新功能的增加,如果它们足够流行的话……但不确定这一个是不是)它在VS2015中对我不起作用。当我将缩进样式更改为“Block”,然后在现有逐字记录字符串周围放置一些大括号时,当我重新自动格式化时,该逐字记录字符串不会与其他代码一起自动向右缩进。即使它真的起作用了,我也无法忍受“块”缩进样式给其他所有东西带来的不便,因为我已经变得如此依赖“智能”缩进样式。这正是我想要的。在Visual Studio 2019 Professional中测试。不幸的是,VS不会自动正确地在具有该设置的示例代码块中缩进。它只是使用与前一行相同的缩进级别缩进每一行,因此如果创建新代码块,则必须手动添加缩进级别。因此,我现在将继续使用智能缩进。您可以检查。智能缩进符合配置的代码样式,因此您不必学习并手动维护所有缩进代码样式规则。块缩进只是机械地使用与前一行相同的缩进级别,这在逐字字符串中非常好,但在我看来,您会失去更重要的功能。