小编MCa*_*tle的帖子

String.Empty与Null的Convert.ToInt32(String)

该表达式Convert.ToInt32(String.Empty)将引发FormatException,因为它无法将空字符串解析为Int32值.

但是,Convert.ToInt32(DirectCast(Nothing, String))VB.NET或Convert.ToInt32((string)null)C#中的表达式将null解析为Int32值为零.

深入研究.NET源代码Convert.cs,我看到以下代码:

public static int ToInt32(String value) {
    if (value == null) 
        return 0;
    return Int32.Parse(value, CultureInfo.CurrentCulture);
}
Run Code Online (Sandbox Code Playgroud)

这解释了行为,但我想理解为什么它是这样编写的,而不是为空字符串返回零?

例如,为什么不写成:

public static int ToInt32(String value) {
    if (String.IsNullOrEmpty(value)) 
        return 0;
    return Int32.Parse(value, CultureInfo.CurrentCulture);
}
Run Code Online (Sandbox Code Playgroud)

(请注意,String.IsNullOrEmpty()Convert.ToInt32()都可以追溯到.NET 2.0,可能更早).

编辑:我的问题与这个问题非常相似,但我也想知道为什么Convert.ToInt32(String.Empty)会引发异常而不是返回Int32的默认值0.(答案String.Empty是不是默认值String,所以没有相关性.)

.net c# type-conversion

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

EF 4.3.1和EF 5.0 DbSet.Local比实际的数据库查询慢

我有一个包含大约16,500个城市的表的数据库,以及该数据库的EF数据模型(数据库优先).我用代码将它们预加载到内存中:

Db.Cities.Load()
Run Code Online (Sandbox Code Playgroud)

...然后在使用它们的时候,我尝试了以下每个查询:

Dim cities() As String = Db.Cities.Select(Function(c) c.CityName).ToArray

Dim cities() As String = Db.Cities.Local.Select(Function(c) c.CityName).ToArray
Run Code Online (Sandbox Code Playgroud)

第一个查询是快速的(约10毫秒),但是第二个查询第一次运行大约需要2.3秒(尽管它比第一个查询在此之后调用时更快).

这没有意义,因为SQL Server Profiler验证第一个查询是在另一台机器上命中数据库,但第二个查询不是!

我试过关掉Db.Configuration.AutoDetectChangesEnabled,我试过预先生成视图.

我能做些什么来.Local加快速度?(并非所有运行此应用程序的客户端都将位于快速LAN上.)

.net vb.net entity-framework entity-framework-5 entity-framework-4.3.1

20
推荐指数
3
解决办法
2758
查看次数

对通用ContinueWith的模糊调用

我正在编写一个简单的C#控制台应用程序,该应用程序使用异步任务和实体框架(意图使用Mono在Linux(RHEL)下运行它,但这是另一个挑战).请注意,我的目标是.NET 4.0,所以我使用的是.ContinueWith()代替await.

这个以及Northwind数据库的EF DB模型是整个应用程序:

using System;
using System.Linq;
using System.Threading.Tasks;

namespace MonoEF
{
    class Program
    {
        private static Model.NorthwindEntities _db = new Model.NorthwindEntities();

        static void Main(string[] args)
        {
            try
            {
                GetCustomerNamesAsync().ContinueWith(t => {
                    if (t.IsFaulted) Console.WriteLine(t.Exception.Flatten.ToString);
                        else if (t.IsCompleted) foreach (string result in t.Result) Console.WriteLine(result);
                    });

                Console.ReadLine();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.ToString());
            }
        }

        private static Task<string[]> GetCustomerNamesAsync()
        {
            return Task.Factory.StartNew(() => (from c in _db.Customers select c.ContactName).Distinct().ToArray());
        } 

    }
}
Run Code Online (Sandbox Code Playgroud)

问题是我在以下错误中收到以下错误.ContinueWith():

Ambiguous …
Run Code Online (Sandbox Code Playgroud)

generics lambda asynchronous task-parallel-library c#-4.0

6
推荐指数
1
解决办法
2852
查看次数

如何检索 DateTimePicker 的下拉状态?

我需要确定日历下拉列表当前是否显示在 WinForms DateTimePicker 中。我有一个从 DateTimePicker 继承的自定义控件,并且我正在处理 KeyDown 事件以使用导航键执行操作,但是如果日历下拉列表打开,我想绕过该代码,以便用户可以在那里使用他们的导航键。

使用 ComboBox 控件,很容易使用.DroppedDown属性来检查它是否打开,但 DateTimePicker 没有这样的属性。

我目前正在做以下事情:

Private _isDroppedDown As Boolean = False

Private Sub MyDateTimePicker_CloseUp(sender As Object, e As EventArgs) Handles Me.CloseUp
    _isDroppedDown = False
End Sub

Private Sub MyDateTimePicker_DropDown(sender As Object, e As EventArgs) Handles Me.DropDown
    _isDroppedDown = True
End Sub
Run Code Online (Sandbox Code Playgroud)

但是,我想知道是否有比使用变量手动跟踪它更好的方法来获取控件的 DroppedDown 状态?

.net vb.net datetimepicker winforms

5
推荐指数
1
解决办法
2708
查看次数

如何创建类库的版本以支持多个版本的.NET Framework?

我正在尝试创建一个类库的系列,这些类在组织内的多个应用程序之间使用.其中一些应用程序面向.NET 3.5和一些目标4.0.

我们希望提供两个版本的程序集,一个定位3.5,一个定位4.0,以便主机应用程序可以选择最适合它们的程序集.

3.5和4.0版本之间存在一些细微差别:

  • 由于被.NET 4.0版本取代,某些类已被删除.
  • 添加了一些类以帮助处理.NET 4.0引入的类.
  • 4.0版本中的某些类已经过修改,以利用4.0中的一些增强的线程支持.

有没有任何解决方案可以让我重复使用代码库的重叠部分,并防止简单地分叉源树?

我的目标是生成针对其指定框架的多个版本的程序集,这些框架可以滚动到NuGet包中并在我们的内部订阅源上公开.

.net visual-studio-2010

4
推荐指数
1
解决办法
922
查看次数

百分比的 NumericUpDown 控件?

如何设置 NumericUpDown 控件以将值显示为百分比?

.net vb.net controls numericupdown winforms

4
推荐指数
1
解决办法
3610
查看次数

EDM模型根上的ASP.NET Web API OData操作

我正在使用OData构建Web API服务,并希望在服务中将方法公开为Action,如下所示.

http://myServer/odata/myAction
Run Code Online (Sandbox Code Playgroud)

我目前正在映射OData路由如下:

Dim modelBuilder As ODataModelBuilder = New ODataConventionModelBuilder
modelBuilder.EntitySet(Of Product)("Products")

Dim myAction = modelBuilder.Action("myAction")
myAction.Parameter(Of String)("Parameter1")
myAction.Returns(Of Boolean)()

Dim model As IEdmModel = modelBuilder.GetEdmModel
config.Routes.MapODataRoute("ODataRoute", "odata", model)
Run Code Online (Sandbox Code Playgroud)

这个精彩的教程展示了如何将动作与这样的实体相关联:

http://myServer/odata/Products(1)/myAction
Run Code Online (Sandbox Code Playgroud)

在本教程之后,我可以在使用以下行创建模型后,在ProductsController类中编写操作的方法:

Dim myAction = modelBuilder.Entity(Of Product).Action("myAction")
Run Code Online (Sandbox Code Playgroud)

但是,如果我不想将操作与实体关联,那么我将在哪里编写操作方法?我需要编写一个DefaultController类吗?

vb.net action odata asp.net-web-api

4
推荐指数
1
解决办法
2791
查看次数