1

我正在关注Professional.Test.Driven.Development.with.Csharp中的示例, 我正在将代码从 C# 转换为 VB。(这个例子是第 7 章的开始)

现在有

Public Class ItemType
   Public Overridable Property Id As Integer
End Class

Public Interface IItemTypeRepository
    Function Save(ItemType As ItemType) As Integer
End Interface

Public Class ItemTypeRepository
  Implements IItemTypeRepository

Public Function Save(ItemType As ItemType) As Integer Implements IItemTypeRepository.Save
    Throw New NotImplementedException
End Function
End Class

并在 TestUnit 项目中

<TestFixture>
Public Class Specification
   Inherits SpecBase
End Class

在 vb.net 中编写测试时(应该失败)它很好地通过了(整数值 0 = 0)

Public Class when_working_with_the_item_type_repository
   Inherits Specification
End Class

Public Class and_saving_a_valid_item_type
   Inherits when_working_with_the_item_type_repository

   Private _result As Integer
   Private _itemTypeRepository As IItemTypeRepository
   Private _testItemType As ItemType
   Private _itemTypeId As Integer

   Protected Overrides Sub Because_of()
       _result = _itemTypeRepository.Save(_testItemType)
   End Sub

   <Test>
   Public Sub then_a_valid_item_type_id_should_be_returned()
       _result.ShouldEqual(_itemTypeId)
   End Sub
End Clas

仅供参考 C# 中的相同代码。测试失败

using NBehave.Spec.NUnit;
using NUnit.Framework;
using OSIM.Core;


namespace CSharpOSIM.UnitTests.OSIM.Core
{
    public class when_working_with_the_item_type_repository : Specification
{
}
    public class and_saving_a_valid_item_type : when_working_with_the_item_type_repository
        {
        private int _result;
        private IItemTypeRepository _itemTypeRepository;
        private ItemType _testItemType;
        private int _itemTypeId;

        protected override void Because_of()
        {
            _result = _itemTypeRepository.Save(_testItemType);
        }

        [Test]
        public void then_a_valid_item_type_id_should_be_returned()
        {
            _result.ShouldEqual(_itemTypeId);
        }
    }
}

测试在此行失败:

_result = _itemTypeRepository.Save(_testItemType);

你调用的对象是空的。

4

1 回答 1

2

值类型变量在 VB.NET 和 C# 中的行为方式存在细微差别。

在 C# 中,创建该变量时不会自动分配值;它是null( Nothing)。所以你不能在声明后直接开始使用它们;对该变量的第一个操作必须是赋值。

另一方面,在 VB.NET 中,第一次使用时会分配一个默认值。0对于数字,False对于Boolean1/1/0001 12:00 AM对于Date,空字符串String等。它们不为空。因此,您可以在声明后立即开始使用它们。

例如

C#:

int i;
i++;        //you can't do this

int j = 0;
j++;        // this works

VB.NET:

Dim i As Integer
i += 1      ' works ok

Dim j As Integer = 0
j += 1      ' this also works

编辑:

请阅读有关String类型变量行为的评论。

于 2014-08-01T10:26:12.277 回答