"类型安全"是什么意思?
language-agnostic computer-science programming-languages terminology type-safety
我可以互换地使用动态和对象类型.这两种类型有什么区别吗?使用一个比另一个有任何性能影响吗?哪一个更灵活?
是否有任何方法可以在4.0框架中使用新的动态功能,如ExpandoObjectVB.NET中没有设置Option Strict Off?使用C#,只有使用您明确声明的变量才会丢失类型安全性dynamic.但是使用VB,我发现使用这些功能的唯一方法就是Option Strict Off从一开始就在VB.NET中使用的旧技巧.如果没有Option Strict,文件中的所有内容都会被模糊输入污染,如下所示:
Option Explicit On
Option Strict Off
Option Infer On
Partial Public Class ClassX
Public Sub TestDynamic()
Dim dyn As Object = New System.Dynamic.ExpandoObject()
Dim a As String = 1 ''# Ew!
Dim obj As Object = "999"
dyn.Str = a ''# a is a string, remember? Even though it has a number
''# dyn.Str = 1 : Type = System.String
Console.WriteLine("dyn.Str = …Run Code Online (Sandbox Code Playgroud) 我试图寻找这个问题的答案,但找不到太多,很可能是因为我不知道如何正确地寻找它,所以这就是它.非常感谢所有帮助.
使用看起来像的基类
abstract public class Property
{
private String name;
public Property(String propertyName)
{
name = propertyName;
}
public String Name
{
get { return name; }
}
abstract public override String ToString();
}
Run Code Online (Sandbox Code Playgroud)
和派生类看起来像
public class StringProperty : Property
{
private String value; // different properties for different types
public StringProperty(String propertyName, String value) : base(propertyName)
{
this.value = value;
}
public String Value // different signature for different properties
{
get { return value; }
}
public override …Run Code Online (Sandbox Code Playgroud) 我想使用方法调用格式化任何数字类型,如下所示:
Option Infer On
Option Strict Off
Imports System.Runtime.CompilerServices
Namespace GPR
Module GPRExtensions
<Extension()>
Public Function ToGPRFormattedString(value) As String
' Use VB's dynamic dispatch to assume that value is numeric
Dim d As Double = CDbl(value)
Dim s = d.ToString("N3")
Dim dynamicValue = value.ToString("N3")
Return dynamicValue
End Function
End Module
End Namespace
Run Code Online (Sandbox Code Playgroud)
现在,从围绕Web的各种讨论(VB.Net相当于C#'动态'与Option Strict On,动态关键字相当于VB.Net?),我认为这个代码在传递数字类型时会起作用(double,Decimal ,int等).它没有,正如您在屏幕截图中看到的:

我可以显式地将参数转换为double然后.ToString("N3")工作,但只是在所谓的动态value参数上调用它失败.
但是,我可以使用以下代码在C#中完成它(使用LINQPad).(注意,编译器不允许您dynamic在扩展方法中使用参数,因此这可能是问题的一部分.)
void Main()
{
Console.WriteLine (1.ToGPRFormattedString());
}
internal static class GPRExtensions
{
public …Run Code Online (Sandbox Code Playgroud) 我有一个基本的过滤器类,存储string参数名称和通用T值.过滤器有一个方法Write(writer As IWriter),可以将过滤器的内容写入HTML页面.该Write方法有两个重载,一个带两个字符串,它接受一个字符串和一个对象.这让我自动引用字符串.
问题是,当我调用writer.Write(ParameterName, Value)并且T是a时string,它调用字符串/对象的重载,而不是字符串/字符串!如果我writer直接调用Write方法,它会按预期工作.
这是C#中的SSCE.我在VB和C#中测试了这个,发现了同样的问题
void Main() {
FooWriter writer = new FooWriter();
Filter<string> f = new Filter<string>() {ParameterName = "param", Value = "value"};
f.Write(writer); //Outputs wrote w/ object
writer.Write(f.ParameterName, f.Value); //Outputs wrote w/ string
}
class FooWriter {
public void Write(string name, object value) {
Console.WriteLine("wrote w/ object");
}
public void Write(string name, string value) {
Console.WriteLine("wrote w/ string");
}
}
class …Run Code Online (Sandbox Code Playgroud) 我记得有一段时间,我正在开发一个基于C#razor的网页.有一个响应属性,作为控制器和页面之间的一种管道.我不知道它叫什么,但它有一个有趣的属性 -
基本上它就像一个字典(字符串,对象),所以你可以通过任何名称转储任何名称,除非你像这样使用它:
ThingNameIDontRemember.name =无论如何
在添加了我想要的东西之后,我认为它们甚至出现在另一侧的intellisense自动完成中(与您对通用对象的期望不同)
这个类型叫什么,它是否也可以在mvc bundle之外使用?在我目前的vb.net项目中,我真的会使用类似的东西.
c# ×3
dynamic ×3
vb.net ×3
.net ×1
.net-4.0 ×1
asp.net-mvc ×1
generics ×1
object ×1
overloading ×1
overriding ×1
polymorphism ×1
terminology ×1
type-safety ×1
types ×1