小编Hei*_*nzi的帖子

即使没有空检查,使用"as"而不是强制转换是否有意义?

在开发博客,在线代码示例和(最近)甚至是一本书中,我一直在寻找像这样的代码:

var y = x as T;
y.SomeMethod();
Run Code Online (Sandbox Code Playgroud)

或者更糟糕的是:

(x as T).SomeMethod();
Run Code Online (Sandbox Code Playgroud)

这对我来说没有意义.如果你确定它x是类型T,你应该使用直接演员:(T)x.如果您不确定,可以使用as但需要null在执行某些操作之前进行检查.以上代码所做的就是将(有用)InvalidCastException变为(无用)NullReferenceException.

我是唯一一个认为这是公然滥用as关键字的人吗?还是我错过了一些明显的东西,上面的模式实际上有意义?

c# casting type-conversion

350
推荐指数
10
解决办法
4万
查看次数

如何解决无法加载的VSTO插件?

我的VSTO Outlook插件突然停止在一台客户机器上工作(它没有加载,没有错误消息)而且我遇到了故障排除问题.该机器是Windows 7 x86,Outlook 2007.该加载项是使用Visual Studio 2008编写的,并使用VSTO 2005和2003 PIA(因为我们还需要支持Outlook 2003).它在其他机器上完美运行.

这是我试图获得有用的故障排除输出:

没有.加载项不会在没有给出任何原因指示的情况下加载.我还检查了"通常的嫌疑人"(CAS政策,安装的PIA,注册表中的LoadBehavior,重新安装VSTO和加载项).

其他一些观察:

  • LoadBehavior在注册表中停留在3.
  • 加载项在Outlook中显示为"已禁用".选中"COM加载项"中的复选框只会执行任何操作(没有错误,第二次输入表单时复选框会再次清除).
  • 它在其他客户机器上运行得非常好,并且在这台机器上运行得非常好.(不,客户不能告诉我他的机器上发生了什么变化.)
  • 我的Trace.WriteLine代码的最顶部(ThisAddIn_Startup处理程序中的第一行)有一条消息,未到达(我使用DebugView检查).因此,不加载的原因不是我的加载项中的例外,而是VSTO加载加载项或Outlook加载VSTO失败.

而不是更随机的调试("试试这个......","试试......"),我真的想强迫Outlook和/或VSTO告诉我什么是错的,即给我一个有用的错误信息而不是只是无所事事试图启用加载项时.有任何想法吗?

.net vsto outlook-addin

73
推荐指数
4
解决办法
9万
查看次数

WPF向TextBlock添加边框

是否可以为文本块添加边框.我需要将它添加到代码下面的setter属性中:

<Style x:Key="notCalled" TargetType="{x:Type TextBlock}">
    <Setter Property="Margin" Value="2,2,2,2" />
    <Setter Property="Background" Value="Transparent" />
</Style>
Run Code Online (Sandbox Code Playgroud)

wpf

64
推荐指数
2
解决办法
10万
查看次数

如何使用C#关键字作为属性名称?

使用asp.net MVC我想在视图中执行此操作:

<%= Html.TextBox("textbox1", null, new { class="class1" }) %>
Run Code Online (Sandbox Code Playgroud)

此语句无法编译,因为class是C#中的关键字.我想知道如何逃避属性名称,以便编译.

如果我将"class"属性更改为"Class"(大写C),则可以编译它.但这不合适,因为严格的xhtml说所有属性(和元素)名称必须是小写的.

.net c# asp.net-mvc

57
推荐指数
1
解决办法
2万
查看次数

Uniqueidentifier(GUID)上的聚合函数

假设我有下表:

category | guid
---------+-----------------------
   A     | 5BC2...
   A     | 6A1C...
   B     | 92A2...
Run Code Online (Sandbox Code Playgroud)

基本上,我想做以下SQL:

SELECT category, MIN(guid)
  FROM myTable
 GROUP BY category
Run Code Online (Sandbox Code Playgroud)

它不一定是MIN.我只想返回每个类别的一个 GUID.我不在乎哪一个.不幸的是,SQL Server不允许在GUID上使用MIN或MAX.

当然,我可以将guid转换为varchar,或者创建一些嵌套的TOP 1 SQL,但这似乎是一个丑陋的解决方法.我错过了一些优雅的解决方案吗?

sql sql-server guid aggregate uniqueidentifier

47
推荐指数
3
解决办法
3万
查看次数

如何将用户提供的输入添加到SQL语句中?

我试图使用用户提供的数据创建一个SQL语句.我在C#中使用与此类似的代码:

var sql = "INSERT INTO myTable (myField1, myField2) " +
          "VALUES ('" + someVariable + "', '" + someTextBox.Text + "');";

var cmd = new SqlCommand(sql, myDbConnection);
cmd.ExecuteNonQuery();
Run Code Online (Sandbox Code Playgroud)

这在VB.NET中:

Dim sql = "INSERT INTO myTable (myField1, myField2) " &
          "VALUES ('" & someVariable & "', '" & someTextBox.Text & "');"

Dim cmd As New SqlCommand(sql, myDbConnection)
cmd.ExecuteNonQuery()
Run Code Online (Sandbox Code Playgroud)

然而,

  • 当用户输入包含单引号(例如O'Brien)时,这会失败,
  • 插入DateTime值时,我似乎无法正确获取格式
  • 人们一直告诉我,由于"SQL注入",我不应该这样做.

我怎么做"正确的方式"?

c# sql vb.net ado.net sql-injection

44
推荐指数
1
解决办法
5439
查看次数

将开发人员文档添加到Visual Studio项目的最佳方法

基本上,问题是:我应该在哪里(以及以何种格式)存储与我的Visual Studio项目相关的文本开发人员文档?

详细说明:XML注释很棒,但它们并不涵盖所有用例.有时,您希望在高级别描述项目的类体系结构,向库中添加使用说明,或者将任何其他类型的消息留给处理此项目的未来几代开发人员.

我想将这些文档作为文件直接添加到Visual Studio项目中,以确保(a)开发人员无需进一步搜索即可使用这些文档,以及(b)它们受版本控制(使用相同的svn/git /任何存储库)作为源代码).

目前,我_Documentation在项目中添加了一个文件夹并使用了文本文件,但我不确定这是否是最佳解决方案.Visual Studio没有自动自动换行文本1的选项,并且在每次更改后手动修复换行符都很烦人.另一方面,Word文档在版本控制方面效果不佳,而TeX在每台开发者PC上设置和教授都太麻烦了.

有没有完善的最佳实践?


1我知道有编辑/高级/自动换行,但这只会影响显示,而不会影响文件本身.

c# vb.net documentation visual-studio

41
推荐指数
1
解决办法
1万
查看次数

为什么$ .NET中的多行正则表达式与CRLF不匹配?

我注意到以下几点:

var b1 = Regex.IsMatch("Line1\nLine2", "Line1$", RegexOptions.Multiline);   // true
var b2 = Regex.IsMatch("Line1\r\nLine2", "Line1$", RegexOptions.Multiline); // false
Run Code Online (Sandbox Code Playgroud)

我糊涂了.RegexOptions的文档说:

多线:多线模式.更改^和$的含义,使它们分别在任何行的开头和结尾匹配,而不仅仅是整个字符串的开头和结尾.

由于C#和VB.NET主要用于Windows世界,我猜大多数.NET应用程序处理的文件都使用CRLF换行符(\r\n)而不是LF换行符(\n).但是,似乎.NET正则表达式解析器无法将CRLF换行符识别为行尾.

我知道我可以解决这个问题,例如,通过匹配Line1\r?$,但它仍然让我感到奇怪.这真的是.NET regexp解析器的预期行为还是我错过了一些隐藏UseWindowsLinebreaks选项?

.net c# regex line-breaks

37
推荐指数
1
解决办法
5461
查看次数

什么使 ValueTuple 协变?

这在 C# 7.3 (Framework 4.8) 中正确编译:

(string, string) s = ("a", "b");
(object, string) o = s;
Run Code Online (Sandbox Code Playgroud)

我知道这是以下内容的语法糖,它也可以正确编译:

ValueTuple<string, string> s = new ValueTuple<string, string>("a", "b");
ValueTuple<object, string> o = s;
Run Code Online (Sandbox Code Playgroud)

所以,看起来 ValueTuples 可以被协变分配,这太棒了

不幸的是,我不明白为什么:我的印象是 C#只支持接口和委托的协变ValueType都不是。

事实上,当我尝试用我自己的代码复制这个功能时,我失败了:

struct MyValueTuple<A, B>
{
    public A Item1;
    public B Item2;

    public MyValueTuple(A item1, B item2)
    {
        Item1 = item1;
        Item2 = item2;
    }
}

...

MyValueTuple<string, string> s = new MyValueTuple<string, string>("a", "b"); …
Run Code Online (Sandbox Code Playgroud)

c# covariance valuetuple

37
推荐指数
1
解决办法
608
查看次数

WPF:对齐Label的基线和TextBox

假设我在Label旁边有一个简单的TextBox:

<StackPanel>
    <StackPanel Orientation="Horizontal">
        <Label Margin="3">MyLabel</Label>
        <TextBox Margin="3" Width="100">MyText</TextBox>
    </StackPanel>
    ...
</StackPanel>
Run Code Online (Sandbox Code Playgroud)

这产生以下结果:

结果

如您所见,MyLabel和MyText的基线未对齐,看起来很难看.当然,我可以开始玩边缘直到它们匹配,但由于这是一个常见的要求,我确信WPF提供了一个更简单,更优雅的解决方案,我还没有找到...

wpf layout alignment baseline

31
推荐指数
3
解决办法
2万
查看次数