小编Nik*_*vak的帖子

在Bash中将分隔的字符串读入数组

我有一个包含空格分隔字符串的变量:

line="1 1.50 string"
Run Code Online (Sandbox Code Playgroud)

我想将带有空格的字符串拆分为分隔符并将结果存储在数组中,以便以下内容:

echo ${arr[0]}
echo ${arr[1]}
echo ${arr[2]}
Run Code Online (Sandbox Code Playgroud)

输出

1
1.50
string
Run Code Online (Sandbox Code Playgroud)

在某个地方我找到了一个不起作用的解决方案:

arr=$(echo ${line})
Run Code Online (Sandbox Code Playgroud)

如果我在此之后运行上面的echo语句,我得到:

1 1.50 string
[empty line]
[empty line]
Run Code Online (Sandbox Code Playgroud)

我也试过了

IFS=" "
arr=$(echo ${line})
Run Code Online (Sandbox Code Playgroud)

结果相同.有人可以帮帮忙吗?

arrays string bash shell

197
推荐指数
4
解决办法
21万
查看次数

如何序列化/反序列化从另一个程序集加载的对象?

我想序列化/反序列化已由从程序集加载的另一个对象实例化的对象:

Interfaces.cs(来自引用的程序集,Interfaces.dll)

public interface ISomeInterface
{
 ISettings Settings { get; set; }
}

public interface ISettings : ISerializable
{
 DateTime StartDate { get; }
}
Run Code Online (Sandbox Code Playgroud)

SomeClass.cs(来自引用的程序集,SomeClass.dll)

public class SomeClass : ISomeInterface
{
 private MySettings settings = new Settings();

 public ISettings Settings
 {
  get { return (ISettings)settings; }
  set { settings = value as MySettings; }
 }
}

[Serializable]
public class MySettings : ISettings
{
 private DateTime dt;

 public MySettings() { dt = DateTime.Now; }

 protected MySettings(SerializationInfo info, StreamingContext context)
 { …
Run Code Online (Sandbox Code Playgroud)

c# serialization deserialization

11
推荐指数
1
解决办法
2万
查看次数

如何正确处理表单,而不会有从已处理对象上的另一个线程调用 Invoke 的风险?

我有一个表单,它“监听”在其他地方引发的事件(不在表单本身,也不是它的子控件之一)。事件由即使在处理 Form 之后仍然存在的对象引发,并且可能在除创建 Form 句柄的线程之外的线程中引发,这意味着我需要在事件处理程序中执行一个 Invoke(以显示形式,例如)。

Dispose(bool)表单(覆盖)的方法中,我取消订阅了调用此方法时可能仍会订阅的所有事件。但是,有时仍会从事件处理程序之一调用 Invoke。我认为这是因为事件处理程序在取消订阅事件前片刻被调用,然后操作系统将控制权切换到执行的 dispose 方法,然后将控制权返回给对已处置对象调用 Invoke 方法的处理程序。

锁定线程无济于事,因为调用 Invoke 将锁定调用线程,直到主线程处理调用的方法。这可能永远不会发生,因为主线程本身可能正在等待释放调用调用线程已获取的对象上的锁,从而造成死锁。

因此,简而言之,当订阅可能在不同线程中引发的外部事件时,如何正确处理表单?

以下是目前一些关键方法的外观。这种方法遇到了我上面描述的问题,但我不确定如何纠正它们。

这是一个处理模型数据部分更改的事件处理程序:

private void updateData()
{
 if (model != null && model.Data != null)
 {
  model.Data.SomeDataChanged -= new MyEventHandler(updateSomeData);

  model.Data.SomeDataChanged += new MyEventHandler(updateSomeData);
 }
 updateSomeData();
}
Run Code Online (Sandbox Code Playgroud)

这是一个必须对视图进行更改的事件处理程序:

private void updateSomeData()
{
 if (this.InvokeRequired) this.myInvoke(new MethodInvoker(updateSomeData));
 else
 {
  // do the necessary changes
 }
}
Run Code Online (Sandbox Code Playgroud)

和 myInvoke 方法:

private object myInvoke(Delegate method)
{
 object res = null;
 lock (lockObject)
 {
  if (!this.IsDisposed) res …
Run Code Online (Sandbox Code Playgroud)

c# events multithreading dispose winforms

5
推荐指数
1
解决办法
4147
查看次数

将double转换为string时,如何将其舍入到C#中的N个小数位?

可能重复:
将小数点后的双精度数加到2位有效数字

我需要最多 N个小数,不多,但我不想尾随零.例如,如果N = 2则

15.352
15.355
15.3
15

应该(分别)

15.35
15.36
15.3
15

c# number-formatting

4
推荐指数
2
解决办法
8194
查看次数

为什么引用类型成员的默认初始化会导致编译器警告?

我有以下代码:

class A {
 public:
  A() { }
};

class B {
 private:
  const A &a;

 public:
  B() : a() { }
  B(const A &ina) : a(ina) { }
};
Run Code Online (Sandbox Code Playgroud)

编译结果如下:

ab.cpp:在构造函数'B :: B()'中:

ab.cpp:11:警告:'const A&B :: a'的默认初始化,它有引用类型

为什么这会导致警告,我该如何解决?

c++ const reference compiler-warnings

1
推荐指数
2
解决办法
2727
查看次数