为什么decimal不是原始类型?
Console.WriteLine(typeof(decimal).IsPrimitive);
Run Code Online (Sandbox Code Playgroud)
输出false.
它是一种基类型,它是语言规范的一部分,但不是原语.什么原始类型代表decimal框架中的一个?一个int例如具有场m_value型的int.A double有一个m_value类型的领域double.事实并非如此decimal.它似乎是由一堆ints 代表,但我不确定.
为什么它看起来像一个原始类型,表现得像一个原始类型(除了在几种情况下)但不是原始类型?
我知道在Windows服务中,最好使用Timer而不是Thread.Sleep(timeout).但是,在我可以在因特网上找到的处理Azure工作者的所有代码示例中,Thread.Sleep(timeout)使用的是代替它的Timer.
甚至Visual Studio中的Worker项目模板中提供的默认代码也使用Thread.Sleep:
public class WorkerRole : RoleEntryPoint
{
public override void Run()
{
// This is a sample worker implementation. Replace with your logic.
Trace.WriteLine("$projectname$ entry point called", "Information");
while (true)
{
Thread.Sleep(10000);
Trace.WriteLine("Working", "Information");
}
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
到目前为止,我一直在使用Thread.Sleep我的工作人员,但没有真正理解为什么.所以我的问题是,为什么Thread.Sleep(timeout)在Azure工作者角色中使用而不是Timer?Windows服务和Azure工作人员之间的区别是什么导致我们应该如何构思这种应用程序?Timer在Azure工作者中使用是好还是坏?
任何解释与某些资源的链接的解释都是受欢迎的,因为到目前为止我找不到任何东西.
为什么可以readonly使用反射修改字段的值而不是a的值const?
class Program
{
static void Main(string[] args)
{
Foobar foobar = new Foobar();
Console.WriteLine(foobar.foo); // Outputs "Hello"
Console.WriteLine(Foobar.bar); // Outputs "Hello"
var field = foobar.GetType().GetField("foo");
field.SetValue(foobar, "World"); // Ok
field = foobar.GetType().GetField("bar");
field.SetValue(foobar, "World"); // Throws FieldAccessException
Console.ReadKey();
}
}
public class Foobar
{
public readonly string foo = "Hello";
public const string bar = "Hello";
}
Run Code Online (Sandbox Code Playgroud)
我已经阅读了这个答案,所以我明白它可以违反规则,readonly但为什么不能const这样呢?我确信这是一个很好的理由,但我无法弄清楚它可能是什么.
- 编辑 -
当我使用ildasm查看上面的代码时,该readonly字段的值在编译时设置.不是在字段本身,const而是在类的构造函数中.所以我不确定为什么可以"覆盖"而不是另一个.
我的意思是,即使const二进制文件中的"硬编码"值是不能修改框架本身的技术限制的原因,因为"它已经设置"或只是一个设计决策.我没有看到任何理由为什么某些地方没有某种"魔法"修改它 …
首先,请原谅任何错字,因为英语不是我的母语.
假设我想在我的应用程序中使用构造函数注入.例如,我会有类似的东西:
public class FileDataProvider : IDataProvider
{
public MyData GetData()
{
// Get data from a file
}
}
public class DatabaseDataProvider : IDataProvider
{
public MyData GetData()
{
// Get data from a database
}
}
public class DataReader : IDataReader
{
private IDataProvider dataProvider;
public DataReader(IDataProvider dataProvider)
{
this.dataProvider = dataProvider;
}
public void OutputData()
{
MyData data = dataProvider.GetData();
Console.WriteLine("{0}", data.ToString());
}
}
Run Code Online (Sandbox Code Playgroud)
如果我使用构造函数注入,我根据定义没有控制或想法实现IDataProvider的类的具体实例将注入到我的DataReader类中.这意味着在我的DataReader类中我不知道GetData方法中发生了什么,包括我不知道它是否可能抛出异常,如果是这样的事实是什么样的异常.
在我的OutputData方法中,我应该将我的代码包装到try {} catch {}块中,如果是这样,我应该捕获什么异常?如果我捕获IOException或SQLException或实际上任何类型的异常意味着我在某种程度上预先设定了IDataProvider可能/应该实现的方式.我认为这不好.我也可以注入一个XMLDataProvider或NetworkResourceDataProvider.但与此同时,我必须在某些时候处理异常.
我的问题:在一般情况下使用控制反转和构造函数注入更具体地处理异常和记录应用程序中发生的事情的正确方法是什么?另外,在实现接口的类中抛出异常的正确方法是什么(如果有的话)?
-
在我的问题中添加一个精度,我将不会拥有将实现IDataProvider的代码,因此我甚至无法确定DataProviderException是否会抛出自定义异常.即使我为开发人员编写指导方针......
具体来说有什么区别
String.Compare(String, String, StringComparison) 和String.Compare(String, String, CultureInfo, CompareOptions)我觉得第二个提供了更多的选项(比较使用任何文化,而不是只有当前的一个或不变的,忽略特殊字符,忽略katakanas(!!)等的宽度...)比第一个.两者都已经在.NET 2.0中引入了它,所以我猜它不能成为向后兼容的问题.
那么有什么区别,什么时候应该使用第一个?什么时候应该使用第二个?
这是C#4.0.
我有一类商店WeakReference的一些作者Action,就好比:
public class LoremIpsum
{
private Dictionary<Type, List<WeakReference>> references = new Dictionary<Type, List<WeakReference>>();
public void KeepReference<T>(Action<T> action)
{
if (this.references.ContainsKey(typeof(T)))
{
this.references[typeof(T)].Add(new WeakReference(action));
}
else
{
this.references.Add(typeof(T), new List<WeakReference> { new WeakReference(action) });
}
}
}
Run Code Online (Sandbox Code Playgroud)
这个类有另一个允许执行Action稍后传递给它的方法,但在这个问题中它并不重要.
我以这种方式使用这个类:
public class Foobar
{
public Bar Bar { get; set; }
public void Foo(LoremIpsum ipsum)
{
ipsum.KeepReference<Bar>((b) => { this.Bar = b; });
ipsum.KeepReference<Bar>(this.Whatever);
}
public void Whatever(Bar bar)
{
// Do anything, for example...: …Run Code Online (Sandbox Code Playgroud) 当我写作
Nullable<Nullable<DateTime>> test = null;
我收到编译错误:
The type 'System.Datetime?' must be a non-nullable value type in order to use it as a paramreter 'T' in the generic type or method 'System.Nullable<T>'
但Nullable<T>它是struct如此,它应该是不可空的.
所以我试着创建这个struct:
public struct Foo<T> where T : struct
{
private T value;
public Foo(T value)
{
this.value = value;
}
public static explicit operator Foo<T>(T? value)
{
return new Foo<T>(value.Value);
}
public static implicit operator T?(Foo<T> value)
{
return new Nullable<T>(value.value);
} …Run Code Online (Sandbox Code Playgroud) 我有一个ListBox和两个ComboBoxes 的视图.当我在中选择一个项目时ListBox,ComboBoxes 的内容/值将根据所选项目的属性值进行刷新.在我的场景中,它ListBox拥有一个客户列表,第一个ComboBox拥有一个国家列表.所选项目是客户的原产国.第二个ComboBox包含城市列表.选定的城市是客户的起源城市.
在ItemsSource第二个的属性ComboBox绑定到一个ListViewCollection基于一ObservableCollection的所有使用过滤器的城市.当国家/地区的选择ListBox发生变化时,我刷新过滤器以仅显示属于所选国家/地区的城市.
我们假设客户A来自新西兰奥克兰,客户B来自加拿大多伦多.当我选择A时,一切正常.第二个ComboBox城市只有新西兰城市,奥克兰被选中.现在我选择B,所选国家现在是加拿大,城市列表只包含加拿大城市,多伦多被选中.如果现在我回到A,新西兰在这些国家/地区被选中,则城市列表仅包含来自新西兰的城市,但未选择奥克兰.
当我调试这个场景时,我注意到当我选择B时,调用ListCollectionView.Refresh()设置最初选择的客户端A上的城市值null(在刷新调用时设置断点,在模型上的城市设置器上设置另一个断点)见下面的代码).
我猜 - 虽然我不是百分百肯定 - 它发生了,因为我对城市有TwoWay约束力,当过滤器将列表更新到加拿大城市时,奥克兰消失,这些信息被送回物业.然后更新为.在某种程度上,这是有道理的.SelectedItemComboBoxnull
我的问题是:我怎样才能避免这种情况发生?如果ItemsSource仅刷新时,如何防止模型上的属性更新?
下面是我的代码(它有点长,虽然我试图使它成为使问题可重现的最小可能代码量):
public class Country
{
public string Name { get; set; }
public IEnumerable<City> Cities { get; set; }
}
public class City
{ …Run Code Online (Sandbox Code Playgroud) 我在C#(4.0)中创建了一个Windows服务,并尝试在命令行中使用installutil工具安装它.但是我得到了一个例外.我设法找出我的代码的哪个部分导致异常 - 使用一些糟糕的日志记录,但不管怎样 - 但现在我想了解原因.所以我想要做的是调试我的Windows服务的安装.
我知道如何调试服务本身,但在这里,我想在服务中调试我的Installer.Install(IDictionary stateSaver)方法的内容.
我试图将调试器附加到cmd.exe进程,但它显然不起作用.我还想将调试器附加到installutil进程,但我不知道如何做到这一点.
我看了一下这篇文章:你如何调试正在安装的Windows服务?和其他几个人但在这种情况下,出于某种原因,这家伙似乎已经在services.msc中提供了他的服务,这不是我的情况.
我怎样才能做到这一点?