我有一些代码,当它执行时,它抛出一个NullReferenceException,说:
你调用的对象是空的.
这是什么意思,我该怎么做才能解决这个错误?
如何找出某个变量所持有的数据类型?(例如int,string,char等)
我现在有这样的事情:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Testing
{
class Program
{
static void Main()
{
Person someone = new Person();
someone.setName(22);
int n = someone.getName();
Console.WriteLine(n.typeOf());
}
}
class Person
{
public int name;
public void setName(int name)
{
this.name = name;
}
public int getName()
{
return this.name;
}
}
}
Run Code Online (Sandbox Code Playgroud) 我使用nameof函数将属性名称作为字符串,因此:
public bool IsRunning => ...;
...
RaisePropertyChanged(nameof(IsRunning));
Run Code Online (Sandbox Code Playgroud)
Resharper通过警告强调了这一点:
使用调用者信息属性传递给参数的显式参数
代码工作,我只是想知道上面的警告是否是我应该担心的事情.
C#6.0引入了nameof()运算符,它返回一个字符串,表示放在其中的任何类/函数/方法/局部变量/属性标识符的名称.
如果我有这样的课程:
class MyClass
{
public SomeOtherClass MyProperty { get; set; }
public void MyMethod()
{
var aLocalVariable = 12;
}
}
Run Code Online (Sandbox Code Playgroud)
我可以像这样使用运算符:
// with class name:
var s = nameof(MyClass); // s == "MyClass"
// with properties:
var s = nameof(MyClass.OneProperty); // s == "OneProperty"
// with methods:
var s = nameof(MyClass.MyMethod); // s == "MyMethod"
// with local variables:
var s = nameof(aLocalVariable); // s == "aLocalVariable".
Run Code Online (Sandbox Code Playgroud)
这很有用,因为在编译时检查了正确的字符串.如果我拼错某些属性/方法/变量的名称,编译器将返回错误.此外,如果我重构,所有字符串都会自动更新.有关实际用例,请参阅此文档.
Java中是否有该运算符的等价物?否则,我怎样才能达到相同的结果(或相似)?
我只是想知道C#6中的nameof如何才能访问非静态属性,就像它是静态的一样.这是一个例子
public class TestClass
{
public string Name { get; set; }
}
public class Test
{
public Test()
{
string name = nameof(TestClass.Name); // whats so speciall about nameof
//string name2 = TestClass.Name; this won't compile obviously,
}
}
Run Code Online (Sandbox Code Playgroud) 在我的程序中,我表示某些对象字段的更改历史记录,如下所示:
struct FieldChange {
property_name: &'static str,
// some other fields
}
let history = Vec<FieldChange>::new();
Run Code Online (Sandbox Code Playgroud)
我这样处理:
match field_change.property_name {
"name" => // do something,
"age" => // do something,
_ => {}
}
Run Code Online (Sandbox Code Playgroud)
为了提高可读性并方便将来的重构,我想写这样的内容:
match field_change.property_name {
nameof(Person::name) => // do something,
nameof(Person::age) => // do something,
_ => {}
}
Run Code Online (Sandbox Code Playgroud)
wherenameof生成&str字段的表示,类似于nameofC# 中的。
我正在寻找的要点是编译器可以验证字段是否存在(例如,在本例中,是否Person确实有name和age字段)。在 Rust 中是否可以像这样提取字段名称?
在C++ 11或更高版本中是否有某种方法可以实现类似的行为:
int some_int;
std::string x=variable_name<some_int>::value; //Theoretical code
std::cout << x;
Run Code Online (Sandbox Code Playgroud)
结果应该是:
some_int
如果没有,是否有编译器特定的方法来做到这一点?我的目标是MSVS.