未初始化的串行端口属性是否在使用默认构造函数时给定默认值?

时间:2016-09-02 17:26:10

标签: c# .net constructor serial-port default-constructor

如果使用默认构造函数或无参数构造函数创建串行端口,则会为端口指定默认值。 From the documentation

// Create a new SerialPort object with default settings.
_serialPort = new SerialPort();
  

当没有指定时,此构造函数使用默认属性值。例如,DataBits属性默认为8,Parity属性默认为None枚举值,StopBits属性默认为1,默认端口名称为COM1。

several constructors

enter image description here

使用带参数的构造函数时:
在使用带参数的构造函数和使用默认构造函数时,不在串行端口构造函数的参数范围内的属性是否给出相同的默认值?

this question中的问题,有趣的答案,评论和随后的聊天讨论让我问这个问题。

1 个答案:

答案 0 :(得分:7)

您可以查看其source code并查看构造函数和归档定义。

您会看到包括PortNameBaudRateDataBitsParityStopBits在内的所有重要属性都有默认值,如果它们不存在,构造函数参数,将使用默认值。

另外一些其他重要的属性也有默认值,虽然它们不在构造函数中,但是在某些情况下它们的默认值可能不太好。

例如,对于HandShake,默认值为Handshake.None;,而您可能希望将其设置为Handshake.XOnXOffHandshake.RequestToSendHandshake.RequestToSendXOnXOff。对于此特定属性,您可能需要参考Hans comments

看看构造函数:

public SerialPort(System.ComponentModel.IContainer container)
{
    container.Add(this);
}
public SerialPort()
{
}
// Non-design SerialPort constructors here chain, 
//using default values for members left unspecified by parameters
public SerialPort(string portName) 
    : this (portName, defaultBaudRate, defaultParity, defaultDataBits, defaultStopBits)
{
}
public SerialPort(string portName, int baudRate) 
    : this (portName, baudRate, defaultParity, defaultDataBits, defaultStopBits)
{
}
public SerialPort(string portName, int baudRate, Parity parity)
    : this (portName, baudRate, parity, defaultDataBits, defaultStopBits)
{
}
public SerialPort(string portName, int baudRate, Parity parity, int dataBits)
    : this (portName, baudRate, parity, dataBits, defaultStopBits)
{
}
public SerialPort(string portName, int baudRate, Parity parity, 
     int dataBits, StopBits stopBits)
{
    this.PortName = portName;
    this.BaudRate = baudRate;
    this.Parity = parity;
    this.DataBits = dataBits;
    this.StopBits = stopBits;
}

以下是这些字段和默认值定义:

// ---------- default values -------------*

private const int defaultDataBits = 8;
private const Parity defaultParity = Parity.None;
private const StopBits defaultStopBits = StopBits.One;
private const Handshake defaultHandshake = Handshake.None;
private const int defaultBufferSize = 1024;
private const string defaultPortName = "COM1";
private const int defaultBaudRate = 9600;
private const bool defaultDtrEnable = false;
private const bool defaultRtsEnable = false;
private const bool defaultDiscardNull = false;
private const byte defaultParityReplace = (byte) '?';
private const int defaultReceivedBytesThreshold = 1;
private const int defaultReadTimeout = SerialPort.InfiniteTimeout;
private const int defaultWriteTimeout = SerialPort.InfiniteTimeout;
private const int defaultReadBufferSize = 4096;
private const int defaultWriteBufferSize = 2048;
private const int maxDataBits = 8;
private const int minDataBits = 5;
private const string defaultNewLine = "\n";

private const string SERIAL_NAME = @"\Device\Serial";
// --------- members supporting exposed properties ------------*
private int baudRate = defaultBaudRate;
private int dataBits = defaultDataBits;
private Parity parity = defaultParity;
private StopBits stopBits = defaultStopBits;
private string portName = defaultPortName;
// ASCII is default encoding for modem communication, etc.
private Encoding encoding = System.Text.Encoding.ASCII; 
private Decoder decoder = System.Text.Encoding.ASCII.GetDecoder();
private int maxByteCountForSingleChar = System.Text.Encoding.ASCII.GetMaxByteCount(1);
private Handshake handshake = defaultHandshake;
private int readTimeout = defaultReadTimeout;
private int writeTimeout = defaultWriteTimeout;
private int receivedBytesThreshold = defaultReceivedBytesThreshold;
private bool discardNull = defaultDiscardNull;
private bool dtrEnable = defaultDtrEnable;
private bool rtsEnable = defaultRtsEnable;
private byte parityReplace = defaultParityReplace;
private string newLine = defaultNewLine;
private int readBufferSize = defaultReadBufferSize;
private int writeBufferSize = defaultWriteBufferSize;