Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 如何覆盖整数、字符串等基本类型。?_Vb.net_Types_Overriding - Fatal编程技术网

Vb.net 如何覆盖整数、字符串等基本类型。?

Vb.net 如何覆盖整数、字符串等基本类型。?,vb.net,types,overriding,Vb.net,Types,Overriding,我正在为一个大型应用程序扩展vb.net中的一些基本数据类型。这包括integer、string、short,等等。目前,我的新数据类型对象的名称类似于MYInteger和MYString。由于这些是我在应用程序中使用的唯一类型,并且它们大部分与默认类型兼容,是否有一种方法可以用我的类型覆盖默认值,这样当您将其设置为整数时,您实际上是在使用我的稍微定制的整数类型?我不确定您是否真的想这样做。这将使它在将来更难维护。为什么不直接使用MyInteger等。如果要导入外部源代码,只需查找并替换即可。否

我正在为一个大型应用程序扩展vb.net中的一些基本数据类型。这包括
integer
string
short
,等等。目前,我的新数据类型对象的名称类似于MYInteger和MYString。由于这些是我在应用程序中使用的唯一类型,并且它们大部分与默认类型兼容,是否有一种方法可以用我的类型覆盖默认值,这样当您
将其设置为整数时,您实际上是在使用我的稍微定制的整数类型?

我不确定您是否真的想这样做。这将使它在将来更难维护。为什么不直接使用MyInteger等。如果要导入外部源代码,只需查找并替换即可。

否。如果可以,请想象会导致的混乱。在这种情况下有两种可能性:

  • 在同一进程中运行的所有代码都将使用这些类型,即使是不希望使用这些类型的代码。糟糕

  • 您的
    整数
    概念与CLR的
    整数
    概念不同,同一类型的两个对象突然不同。糟糕

  • 您可以向密封类型添加扩展方法。比如:

    Module MyExtensions
        <Extension()>
        Public Function Extended(i as Integer) As Integer
            return i + 4
        End Function
    End Module
    
    4.Extended() ' evaluates to 8
    
    模块MyExtensions
    公共函数扩展(i为整数)为整数
    返回i+4
    端函数
    端模块
    4.Extended()'的计算结果为8
    
    我不知道它是否适用于您的情况,但有时人们希望生成“专用”标量/基本类型

    例如,请参见中定义的某些类型。其中一些类型包括纬度、经度、角度等。这些类型中的每一种实际上都是一个具有单个数据成员的结构,通常是double、float或int/long,例如:

    public struct Latitude : IFormattable, IComparable<Latitude>, IEquatable<Latitude>
    {
      private readonly double _DecimalDegrees;
    
      //Some constants
    
      //Some constructors
    
      //Some static fields like...
      public static readonly Latitude Equator = new Latitude(0.0);
      public static readonly Latitude TropicOfCapricorn = new Latitude(-23.5);
      public static readonly Latitude TropicOfCander = new Latitude(23.5);
    
      //Some operators
      public static Latitude operator +(Latitude left, Latitude right)
      {
        return new Latitude(left.DecimalDegrees + right.DecimalDegrees);
      }
    
      public static Latitude operator +(Latitude left, double right)
      {
        return new Latitude(left.DecimalDegrees + right);
      }
    }
    
    将值指定给AngleInDegrees时,MyObject可能需要执行一些处理:

    public double AngleInDegrees
    {
      get
      {
        return _AngleInDegrees;
      }
      set
      {
        if (value < 0 || value > 360)
        {
          _AngleInDegrees = NormalizeAngle(value);
        }
        else
        {
          _AngleInDegrees = value;
        }
      }
    }
    
    公共双角度基准
    {
    得到
    {
    返回角度指数;
    }
    设置
    {
    如果(值<0 | |值>360)
    {
    _角度角度=标准化角度(值);
    }
    其他的
    {
    _角度指数=数值;
    }
    }
    }
    
    如果在许多对象上都有AngleInDegrees属性,该怎么办?如果有一个类使用应用程序中其他组件生成的角度,该怎么办?谁应该做验证?这是有用的,能够指望始终与“好”的角度工作

    通过使用AngleInDegrees类型,可以在该类型中放置所有验证和特殊的“角度”操作。还可以在所有要使用AngleInDegrees的位置强键入


    正如我所说,我不知道这是否是你想要实现的事情。当我读到你的问题时,我突然想到,当我第一次看到我链接的项目时,我也有同样的想法(也就是说,它们实际上是对基本数据类型进行子类化,以形成更严格的基本类型)。

    你有理由使用新的基本类型吗?为什么不能使用扩展方法呢?我认为这几乎打破了所有编程规则。然而,我也不认为这是可能的。总的来说,这听起来是一个很好的扩展方法。首先,检查一下最近辞职的程序员是否也可以访问FBI的证人保护程序。我担心我做不到这一点。这主要是因为所讨论的代码将由很多人来处理,我们已经遇到了一些问题,一些人使用普通整数,一些人使用自定义类型,然后出现了很多混乱。有些函数是使用默认值编写的,有些是自定义的,我希望简化一些事情。
    public double AngleInDegrees
    {
      get
      {
        return _AngleInDegrees;
      }
      set
      {
        if (value < 0 || value > 360)
        {
          _AngleInDegrees = NormalizeAngle(value);
        }
        else
        {
          _AngleInDegrees = value;
        }
      }
    }