在开发博客,在线代码示例和(最近)甚至是一本书中,我一直在寻找像这样的代码:
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关键字的人吗?还是我错过了一些明显的东西,上面的模式实际上有意义?
我的VSTO Outlook插件突然停止在一台客户机器上工作(它没有加载,没有错误消息)而且我遇到了故障排除问题.该机器是Windows 7 x86,Outlook 2007.该加载项是使用Visual Studio 2008编写的,并使用VSTO 2005和2003 PIA(因为我们还需要支持Outlook 2003).它在其他机器上完美运行.
这是我试图获得有用的故障排除输出:
VSTO_SUPPRESSDISPLAYALERTS环境变量(设置为0).没有.加载项不会在没有给出任何原因指示的情况下加载.我还检查了"通常的嫌疑人"(CAS政策,安装的PIA,注册表中的LoadBehavior,重新安装VSTO和加载项).
其他一些观察:
LoadBehavior在注册表中停留在3.Trace.WriteLine代码的最顶部(ThisAddIn_Startup处理程序中的第一行)有一条消息,未到达(我使用DebugView检查).因此,不加载的原因不是我的加载项中的例外,而是VSTO加载加载项或Outlook加载VSTO失败.而不是更随机的调试("试试这个......","试试......"),我真的想强迫Outlook和/或VSTO告诉我什么是错的,即给我一个有用的错误信息而不是只是无所事事试图启用加载项时.有任何想法吗?
是否可以为文本块添加边框.我需要将它添加到代码下面的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) 使用asp.net MVC我想在视图中执行此操作:
<%= Html.TextBox("textbox1", null, new { class="class1" }) %>
Run Code Online (Sandbox Code Playgroud)
此语句无法编译,因为class是C#中的关键字.我想知道如何逃避属性名称,以便编译.
如果我将"class"属性更改为"Class"(大写C),则可以编译它.但这不合适,因为严格的xhtml说所有属性(和元素)名称必须是小写的.
假设我有下表:
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语句.我在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)时,这会失败,我怎么做"正确的方式"?
基本上,问题是:我应该在哪里(以及以何种格式)存储与我的Visual Studio项目相关的文本开发人员文档?
详细说明:XML注释很棒,但它们并不涵盖所有用例.有时,您希望在高级别描述项目的类体系结构,向库中添加使用说明,或者将任何其他类型的消息留给处理此项目的未来几代开发人员.
我想将这些文档作为文件直接添加到Visual Studio项目中,以确保(a)开发人员无需进一步搜索即可使用这些文档,以及(b)它们受版本控制(使用相同的svn/git /任何存储库)作为源代码).
目前,我_Documentation在项目中添加了一个文件夹并使用了文本文件,但我不确定这是否是最佳解决方案.Visual Studio没有自动自动换行文本1的选项,并且在每次更改后手动修复换行符都很烦人.另一方面,Word文档在版本控制方面效果不佳,而TeX在每台开发者PC上设置和教授都太麻烦了.
有没有完善的最佳实践?
1我知道有编辑/高级/自动换行,但这只会影响显示,而不会影响文件本身.
我注意到以下几点:
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选项?
这在 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) 假设我在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提供了一个更简单,更优雅的解决方案,我还没有找到...
c# ×6
.net ×3
sql ×2
vb.net ×2
wpf ×2
ado.net ×1
aggregate ×1
alignment ×1
asp.net-mvc ×1
baseline ×1
casting ×1
covariance ×1
guid ×1
layout ×1
line-breaks ×1
regex ×1
sql-server ×1
valuetuple ×1
vsto ×1