GVKun编程网logo

我应该关闭StringReader吗?(stringwriter需要关闭吗)

10

本文将带您了解关于我应该关闭StringReader吗?的新内容,同时我们还将为您解释stringwriter需要关闭吗的相关知识,另外,我们还将为您提供关于.net–可以不配置MemoryStrea

本文将带您了解关于我应该关闭StringReader吗?的新内容,同时我们还将为您解释stringwriter需要关闭吗的相关知识,另外,我们还将为您提供关于.net – 可以不配置MemoryStream / StringReader吗?、android – 我应该使用strings.xml / R.string而不是全局字符串常量(例如对于意图中的键)吗?、c – 我应该使用另一个streambuf创建一个临时ostream吗?、c# – 关闭FileStream会关闭StreamReader吗?的实用信息。

本文目录一览:

我应该关闭StringReader吗?(stringwriter需要关闭吗)

我应该关闭StringReader吗?(stringwriter需要关闭吗)

我使用a
StringReader将字符串转换为可以上传到SFTP服务器的文件(需要流)。StringReader事后结束这一点有什么意义吗?据我在源代码中看到的,它只是将字符串设置为null

我可以这样做,但是由于将close方法标记为throw,IOException并且我只需要将其包装在try
catch中,代码最终看起来比可能需要的可怕得多。

答案1

小编典典

如果您知道要处理的StringReader是您将要扔掉的产品,那么我看不出有什么理由要关闭它。我无法想象关闭它后会保留对它的引用的任何原因,因此将字符串设置null为垃圾回收并没有真正的好处。如果要创建一个采用a的方法,Reader则可能会关闭它,因为您不知道基础类型。

.net – 可以不配置MemoryStream / StringReader吗?

.net – 可以不配置MemoryStream / StringReader吗?

我想创建一个返回XmlReader的方法.根据具体情况,可以向XmlReader提供不同类型的流,StringReader或MemoryStream.

通常我使用一个使用块来处理StringReader或MemoryStream,但是因为我想要返回一个XmlReader,如果我想要使用这个设计,我不能这样做.
我不希望MemoryStream分配大量的内存,所以我可以忍受资源释放的轻微延迟.

在这种情况下让GC处理StringReader和MemoryStream的后果是否可以接受?

我应该澄清,这是一个实际问题,而不是最佳实践问题.显然,这个理论要求我应该清理自己的资源分配,但理论上也说我应该选择最简单的设计来实现最大的可维护性.在某些情况下,打破最佳实践可以证明IMHO是合理的,我的问题是这个具体案例是否有理由打破最佳实践.

这也只是关于StringReader和MemoryStream,而不是一般的流或读者.
我在这种情况下证明它的理由是,StringReader / MemoryStream的实际创建被很好地封装在返回XmlReader的方法中,因此可以控制XmlReader不会被提供有限资源的流.

解决方法

在这种情况下,没有什么会受到影响,但IMO仍然是非常糟糕的做法.你拥有它们 – 为什么不正确呢?实际上,处理MemoryStream仍然无法解除分配等 – 它仍然受GC限制.但是这里有一个明显的代码味道.如果有任何变化,这可能成为真正的问题,突然间它不是MemoryStream而是其他东西,等等.

我们不能让你处理它,但个人:我对我的使用很挑剔

android – 我应该使用strings.xml / R.string而不是全局字符串常量(例如对于意图中的键)吗?

android – 我应该使用strings.xml / R.string而不是全局字符串常量(例如对于意图中的键)吗?

我想知道你是否应该使用strings.xml而不是全局常量.我了解到应该避免使用全局变量,但是又有可能没有像这样使用strings.xml吗?

使用其中一个是否有任何优点/缺点?

我很确定像下面这样的硬编码字符串不是一个好方法.

putExtra("extraKey",extra);

使用strings.xml或Constants,您可以使用拼写检查和自动完成功能.

R.string的典型行可能如下所示.

intent.putExtra(getString(R.string.first_player_for_intent),firstPlayer);

与…相比

intent.putExtra(MyClass.first_player_for_intent),firstPlayer);

如果你应该使用常量,它们应该在哪个类中?

解决方法

我不会使用res / strings.xml来存储常量.即使您没有上下文,也可能需要访问它们的值.此外,您的密钥不需要本地化.关于你应该存放它的地方,这取决于你,而imo,这只是一个品味问题.我通常避免为常量而设一个专用类,但我将其声明为imo所属的地方.例如,如果你有一个名为Player的类,我会将所有与Player相关的常量放在那里.

c – 我应该使用另一个streambuf创建一个临时ostream吗?

c – 我应该使用另一个streambuf创建一个临时ostream吗?

假设我有一个功能,需要ostream&参数o并写入该ostream.操作者<实施将是一个很好的例子.
ostream& operator << (ostream& o,const MyThing& t)
{
  // ... interesting code here ...
  return o;
}

在函数中,我可能想要在流上指定格式选项.例如,我可能希望将一个数字打印为十六进制,无论在传入函数时如何配置o.

其次,我可能想要对当前格式标志做出假设.例如,除非另有要求,否则可以假设数字格式为十进制格式是很好的.

最后,当函数退出时,我希望o上的格式化选项与调用函数之前的格式相同,以便调用者不变.这只是一个礼貌的呼叫者的问题.

到目前为止,我已经通过在函数中创建一个本地的ostringstream来实现这一点,完成所有的工作(包括设置格式化选项),并在函数结束时将.str()发送到o. StackOverflow问题here表明,比我更聪明的人采取同样的做法.然而,令我感到困扰的是,我在ostringstreams中保留了很多数据,这些数据可能早些时候被发送到输出(字符串可以变得相当大).

我有两个问题:

1)在o.rdbuf()周围创建一个临时(基于堆栈)的ostream是合法的,习惯的,良好的形式等,并且在这个ostream上做我的工作吗?我自己的测试和cppreference.com的页面似乎表明我可以.

ostream& operator << (ostream& o_,const MyThing& t)
{
  ostream o (o_.rdbuf());
  // write stuff to "o",// setting formatting options as I go.
  return o_; // Formatting on the parameter ostream o_ unchanged.
}

2)还有另一个更好的方法,我没有考虑过?

解决方法

Boost IO State Savers完全是为此建立的.

c# – 关闭FileStream会关闭StreamReader吗?

c# – 关闭FileStream会关闭StreamReader吗?

如果我使用FileStream创建StreamReader,当我关闭FileStream时StreamReader会关闭还是我还需要关闭StreamReader?
public void ReadFile()
{
    var file = new FileStream("c:\file.txt",FileMode.Open,FileAccess.Read);
    var reader = new StreamReader(file);

    try
    {
        txtFile.Text = reader.ReadToEnd();
    }
    catch (Exception)
    {
        throw;
    }
    finally
    {
        file.Close();
    }
}

解决方法

基本上是的.您实际上不必关闭StreamReader.如果这样做,它所做的就是关闭底层流.

@Bruno对关闭最外层包装器提出了一个很好的观点.最好关闭最外层的流并让它关闭底层流,以确保正确释放所有资源.

来自Reflector ……

public class StreamReader : TextReader
{
    public override void Close()
    {
        this.dispose(true);
    }

    protected override void dispose(bool disposing)
    {
        try
        {
            if ((this.Closable && disposing) && (this.stream != null))
            {
                this.stream.Close();
            }
        }
        finally
        {
            if (this.Closable && (this.stream != null))
            {
                this.stream = null;
                this.encoding = null;
                this.decoder = null;
                this.byteBuffer = null;
                this.charBuffer = null;
                this.charPos = 0;
                this.charLen = 0;
                base.dispose(disposing);
            }
        }
    }
}

今天关于我应该关闭StringReader吗?stringwriter需要关闭吗的分享就到这里,希望大家有所收获,若想了解更多关于.net – 可以不配置MemoryStream / StringReader吗?、android – 我应该使用strings.xml / R.string而不是全局字符串常量(例如对于意图中的键)吗?、c – 我应该使用另一个streambuf创建一个临时ostream吗?、c# – 关闭FileStream会关闭StreamReader吗?等相关知识,可以在本站进行查询。

本文标签: