我有这样的方法:
public static async Task SaveAllAsync()
{
foreach (var kvp in configurationFileMap)
{
using (XmlWriter xmlWriter = XmlWriter.Create(kvp.Value, XML_WRITER_SETTINGS))
{
FieldInfo[] allPublicFields =
kvp.Key.GetFields(BindingFlags.Public | BindingFlags.Static);
await xmlWriter.WriteStartDocumentAsync();
foreach (FieldInfo fi in allPublicFields)
{
await xmlWriter.WriteStartElementAsync("some", "text", "here");
}
await xmlWriter.WriteEndDocumentAsync();
}
}
}
Run Code Online (Sandbox Code Playgroud)
但我正在努力追随当有人打电话时会发生什么SaveAllAsync().
我认为会发生的是:
SaveAllAsync()会将控制权返回给该行的调用者await xmlWriter.WriteStartDocumentAsync();SaveAllAsync()(或等待任务)时......会发生什么?将SaveAllAsync()仍然是第一的await坚持到它被调用?因为没有涉及线程,我猜是这样的......在大多数情况下,我们被告知更喜欢Volatile.Read而不是Thread.VolatileRead,因为后者发出了全栅栏,而前者仅发射相关的半栅栏(例如获取栅栏); 哪个更有效率.
但是,根据我的理解,Thread.VolatileRead实际上提供的东西Volatile.Read没有,因为实施Thread.VolatileRead:
public static int VolatileRead(ref int address) {
int num = address;
Thread.MemoryBarrier();
return num;
}
Run Code Online (Sandbox Code Playgroud)
由于实现的第二行有完整的内存障碍,我相信VolatileRead实际上确保address将读取最后写入的值.根据维基百科的说法,"完整的围栏确保围栏之前的所有装载和存储操作都将在围栏之后发布的任何装载和存储之前提交." .
我的理解是否正确?因此,Thread.VolatileRead仍然提供不具备的东西Volatile.Read吗?
我将此添加到我的表单的构造函数代码中:
this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.DoubleBuffer, true);
Run Code Online (Sandbox Code Playgroud)
但是当它加载控件时,无论何时更改(表单及其组件经常更改(需要更新)),它仍会显示丑陋的工件.
我需要做些什么不同的事情?
我正在尝试使用我.MemberwiseClone()的自定义类,但它会引发此错误:
Cannot access protected member 'object.MemberwiseClone()' via a qualifier of type 'BLBGameBase_V2.Enemy'; the qualifier must be of type 'BLBGameBase_V2.GameBase' (or derived from it)
Run Code Online (Sandbox Code Playgroud)
这是什么意思?或者更好的是,我如何克隆一个Enemy类?
请考虑以下代码:
public static void main(String[] args) {
File file = new File("C:\\someFile.txt") {
public void doStuff() {
// Do some stuff
}
};
file.doStuff(); // "Cannot resolve method"
}
Run Code Online (Sandbox Code Playgroud)
当我们尝试调用新定义的方法时doStuff(),这是不可能的.原因是它file被声明为类型的对象File而不是我们新的匿名子类的实例.
所以,我的问题是,有没有"好的"方法来实现这种行为?除了显而易见的(只是,正确地宣布类).
可能重复:
C#构造函数执行顺序
class Foo
{
public int abc;
Foo()
{
abc = 3;
}
}
class Bar : Foo
{
Bar() : base()
{
abc = 2;
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,当创建Bar的对象时,BarObject.abc的值是多少?基础构造函数是第一个调用,还是Bar()运行,/ then/base()构造函数?
如果我有课:
public class GenericClass<TBlah extends Number> {
public List<String> getList() {
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试从另一个类使用该方法时:
public class OtherClass {
public void test() {
GenericClass a = null;
for (String s : a.getList()) {
}
}
}
Run Code Online (Sandbox Code Playgroud)
为什么a.getList()返回a List<Object>直到我将for循环上面的行更改为:
GenericClass<Number> a = null;
Run Code Online (Sandbox Code Playgroud)
那时a.getList()返回一个List<String>它应该做的事情?
编辑:我不明白为什么指定的合同getList()应该受到如何声明我的变量'a'的影响.getList()永远都会回归List<String>,而TBlah是什么并不重要.
我把它作为我的'KeyEvent'类的成员之一:
private delegate void eventmethod();
Run Code Online (Sandbox Code Playgroud)
和构造函数:
public KeyEvent(eventmethod D)
{
D();
}
Run Code Online (Sandbox Code Playgroud)
我想要做的不是在那里调用D(),我想将该方法(D)存储为KeyEvent的成员变量,所以类似于:
stored_method = D();
Run Code Online (Sandbox Code Playgroud)
然后在另一个KeyEvent方法中,执行以下操作:
stored_method();
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
c# ×6
c++ ×2
java ×2
.net ×1
async-await ×1
asynchronous ×1
base ×1
clone ×1
constructor ×1
delegates ×1
generics ×1
handle ×1
member ×1
methods ×1
sdk ×1
type-erasure ×1
winforms ×1