我想知道是否有一个工具可以使用静态代码分析在C#中找到未捕获的异常?基本上我想选择一个方法A()并想要一个由methodA()抛出的所有异常的列表以及methodA()调用的所有方法.我尝试过ReSharper + Agent Johnson和AtomineerUtils,都失败了这个简单的任务.
这是我的示例代码:
public class Rectangle
{
public int Width { get; set; }
public int Height { get; set; }
public int Area()
{
CheckProperties();
long x = Width * Height;
if (x > 10)
throw new ArgumentOutOfRangeException();
return (int) x;
}
private void CheckProperties()
{
if (Width < 0 || Height < 0)
throw new InvalidOperationException();
}
}
Run Code Online (Sandbox Code Playgroud)
该工具应该能够告诉我(以任何形式)方法Area()将抛出ArgumentOutOfRangeException或InvalidOperationException.
是否可以使用C#枚举GAC中所有已安装的程序集版本?例如,我有一个名为"My.Assembly"的程序集.该程序集可能有各种版本("1.0.0.0","2.3.4.5","0.1.2.4",...),可以针对各种平台(x86,x64,任何CPU)进行编译.
现在我需要一种方法来确定安装了哪个版本/平台.
我知道我可以枚举GAC中的目录,但这似乎是错误的.应该有更好的方法来做到这一点.
背景 我有一个启动器应用程序,用户在其中选择一个DLL.启动程序从DLL中检索一些信息(不加载它),然后必须启动正确的托管C#应用程序来处理DLL.DLL可以针对Win32或x64编译,暴露始终是相同的(平台无关的)接口.我使用LoadLibrary函数在C#应用程序中加载DLL.唯一的问题是该过程必须是匹配格式(x86或x64).可以而且应该为x86,x64和任何CPU编译C#应用程序.
我在实现自定义DependencyObject时遇到问题:
我需要一个转换器来设置或取消绑定属性中的枚举标志.因此,我创建了一个IValueConverter,它来自FrameworkElement,带有两个DependencyProperties:Flag(由转换器设置/取消设置的标志)和Flags(要修改的值/属性).父UserControl(Name = EnumerationEditor)提供转换器绑定的属性.
ListBox生成CheckBoxes和转换器实例,用于通过DataTemplate修改属性.每个CheckBox /转换器实例用于一个标志.我使用以下XAML代码:
<ListBox Name="Values" SelectionMode="Extended" BorderThickness="1" BorderBrush="Black" Padding="5">
<ListBox.ItemTemplate>
<DataTemplate DataType="{x:Type system:Enum}">
<DataTemplate.Resources>
<Label x:Key="myTestResource" x:Shared="False"
Content="{Binding}"
ToolTip="{Binding Path=Value, ElementName=EnumerationEditor}"
Foreground="{Binding Path=Background, ElementName=EnumerationEditor}"
Background="{Binding Path=Foreground, ElementName=EnumerationEditor}"/>
<converters:EnumerationConverter x:Key="EnumerationConverter" x:Shared="False"
Flag="{Binding}"
Flags="{Binding Path=Value, ElementName=EnumerationEditor}"/>
</DataTemplate.Resources>
<StackPanel Orientation="Horizontal">
<CheckBox Content="{Binding}" IsChecked="{Binding Path=Value, ElementName=EnumerationEditor, Converter={StaticResource EnumerationConverter}}"/>
<ContentPresenter Content="{StaticResource myTestResource}"/>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Run Code Online (Sandbox Code Playgroud)
奇怪的是:标签工作正常 - 但转换器没有.我收到错误:
System.Windows.Data错误:4:无法找到引用'ElementName = EnumerationEditor'的绑定源.BindingExpression:路径=值; 的DataItem = NULL; target元素是'EnumerationConverter'(Name =''); target属性是'Flags'(类型'Enum')
我不明白为什么,绑定基本相同......
这是转换器的代码:
public class EnumerationConverter : FrameworkElement, IValueConverter
{
#region IValueConverter
public object …Run Code Online (Sandbox Code Playgroud) 我想知道为什么代码分析(在VS 2012中)为以下代码发出"CA1819:属性不应返回数组":
private byte[] BackingFieldData;
public byte[] Data
{
get { return this.BackingFieldData; }
set { this.BackingFieldData = value; }
}
Run Code Online (Sandbox Code Playgroud)
警告状态的描述属性返回的数组不受写保护,即使该属性是只读的.为了防止数组防篡改,属性必须返回数组的副本.
我想要的是返回数组.用户应该能够修改数组,但不能调整它的大小.用户经常访问阵列的大小.用户必须能够通过索引访问元素.因此阵列类型看起来非常合适.
我考虑过的替代方法IEnumerable<byte>(索引是使用Skip和Take等完成的),IList<byte>(专注于添加和删除元素 - 我不希望这样)和ReadOnlyCollection<byte>(我讨厌当类暴露方法总是抛出NotSupportedExceptions,远离良好的编码风格恕我直言).我还考虑过在数组周围创建一个带有包装类的自定义接口 - 但是重点是什么(除了我可以在不压制它的情况下摆脱警告).
那么,有没有人知道要返回的好类型而不是数组类型或者在这种情况下为什么不返回数组?到目前为止我没有提到任何影响吗?