【问题标题】:How should I work around WinRT JS saying null is "null"?我应该如何解决 WinRT JS 说 null 是“null”?
【发布时间】:2013-01-22 20:24:57
【问题描述】:

所以我最近与 Javascript 和 WinRT 面对面交流。基本上,我正在开发一个 WinRT API,所以它应该可以很好地与 Javascript、C++ 和 C# 配合使用。如果传入的值为空,我在 API 中有一个属性可以执行特殊操作。所以,例如:

public string Foo
{
  get
  {
    return foobar.ToString();
  }
  set
  {
    if(string.IsNullOrEmpty(value))
    {
      foobar=SomeSpecialValue;
      return;
    }
    ParseIntoFoobar(value);
  }
}

对我来说,这似乎是一个完美的属性。但是,当您在 Javascript 中使用类似这样的内容时:

myFoobar.foo=null;

结果是ParseIntoFoobar抛出解析异常,为什么?因为显然 Javascript 中 null 的值是 "null",就像 一个包含单词 null`的字符串

从我看到的文档来看,这应该导致 C# 转换为 null,或者它应该导致一个空字符串,而不是这个愚蠢的结果。事实上,你可以做出一些对我来说毫无意义的非常不直观的行为。投影:

public string Biz{get;set;}

Javascript:

myObject.biz=null;
log(myObject.biz==null); //results in false

解决此“功能”的最佳方法是什么?我应该如何处理我想要检测空值但"null" 作为字符串并不完全无效的情况? (想想用户名之类的)

【问题讨论】:

  • @bfavaretto 好吧,在 WinRT 中没有空字符串。我没问题。在 C++ 中,传递给字符串参数的空指针将导致一个空字符串......但这不是一个空字符串。这可能是迄今为止我见过微软做的最奇怪的事情
  • 不会是public string? Biz{get;set;}吗?
  • @bfavaretto no 因为string已经是引用类型,WinRT中没有null这种东西
  • 对不起,我对 WinRT 一无所知。但维基百科说:“在 WinRT 中,字符串是不可变的,不允许空值。如果空值通过具有空语义的语言传递给 WinRT 中的字符串,则该值将转换为空字符串。” en.wikipedia.org/wiki/Windows_Runtime#Restrictions_and_rules 所以应该转换成"",而不是"null"...
  • @bfavaretto 是的,这就是我的观点……但事实并非如此

标签: c# javascript null windows-runtime projection


【解决方案1】:

你可以只使用被普遍接受的空字符串 "" (string.Empty)。

我关于为什么 null 不可接受的“猜测”可能是因为某种类型映射技巧正在发生以使所有内容都兼容。 C++ 可能会做一些奇怪的事情,比如将空引用转换为 '\0'(空字符),这将是一个空字符串。

【讨论】:

  • @Earlz - 而不是草率但广泛使用的 null 或空的约定,只是对空进行标准化。
  • 请参阅channel9.msdn.com/Events/BUILD/BUILD2011/PLAT-876T 声明这是设计使然以及(某种)背后的原因。它在大约 40 分钟时讨论了这种行为
猜你喜欢
  • 2010-10-22
  • 2018-02-16
  • 2022-06-14
  • 2019-11-09
  • 2021-11-12
  • 1970-01-01
  • 2012-02-23
  • 1970-01-01
  • 2013-08-08
相关资源
最近更新 更多