Вы звоните pizzaPrice()
, но вам нужно сохранить полученное значение в переменной, чтобы вы могли использовать его позже (и передать правильные параметры).
double pricePerInchRound = pizzaPrice(radius, priceRound);
и ...
double pricePerInchRect = pizzaPrice(width, length, priceRect);
Кроме того, позаботьтесь о том, чтобы лучше называть параметры вашего метода - num1, num2 не очень описательны. Вы могли бы использовать ширину, длину.
Что ж, вы определенно хотите, чтобы int64
или sfixed64
справились со значением, которое подписывается.
Только что выполнив быстрый тест, DateTime.Now.ToBinary ()
кодируется в 10 байтов с использованием int64
, тогда как sfixed64
всегда будет использовать 8 байтов. По сути, кодирование переменной длины отлично подходит для небольших чисел, но становится больше, чем фиксированное кодирование для больших чисел. (Это тот же тип компромисса, что и при использовании UTF-8 вместо UTF-16 - символы ASCII можно кодировать в UTF-8 одним байтом, но позже кодовые точки в конечном итоге кодируются как 2, а затем 3 байта, тогда как UTF -16 всегда использует 2 байта для символов в BMP.)
Я предполагаю, что DateTime.
Вы должны использовать 64-битное число со знаком, не потому что DateTime
может быть отрицательным, а потому что метод ToBinary
возвращает Int64
, представляющее собой 64-разрядное число со знаком.
In protobuf-net, I use a graduated scale approach (and indeed, it handles all this for you if you simply use DateTime
) - the equivalent .proto is something like this:
message DateTime {
optional sint64 value = 1; // the offset (in units of the selected scale)
// from 1970/01/01
optional TimeSpanScale scale = 2 [default = DAYS]; // the scale of the
// timespan
enum TimeSpanScale {
DAYS = 0;
HOURS = 1;
MINUTES = 2;
SECONDS = 3;
MILLISECONDS = 4;
MINMAX = 15; // dubious
}
}
i.e. if the DateTime
can be expressed in whole days, I just send the number of days since 1970, etc - plus a small marker to the scale. This means that dates can be sent a bit more efficiently, but it doesn't really cost much more for other scales.
Personally, I wouldn't use ToBinary()
- I would explicitly use an offset of a known scale from a known epoch (such as the unix epoch). This makes it more portable between platforms. But if you are sending (for example) just the millisecond offset, then a fixed scale would usually be more efficient than a variant-length scale. Whether you need signed or unsigned depends on whether you need dates before your epoch ;-p