Почему в методе всегда возвращает 0 ? Код библиотеки и приложения в сообщении
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Variant2
{
public class Room
{
double length;
double width;
public double Length
{
get { return length; }
set { length = value; }
}
public double Width
{
get { return width; }
set { width = value; }
}
public double square()
{
return length * width;
}
public double AreaPerson(int n)
{
return square() / n;
}
}
public class Office : Room
{
double rozetok;
public double Rozetok
{
get { return rozetok; }
set { rozetok = value; }
}
public double Places(double s)
{
if (rozetok >= 2 && square() > s)
{
return square() / rozetok;
}
else
{
return 0;
}
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Variant2;
namespace WpfApp31
{
/// <summary>
/// Логика взаимодействия для MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
Room room1 = new Room();
Office office = new Office();
public MainWindow()
{
InitializeComponent();
}
private void BT_Click(object sender, RoutedEventArgs e)
{
room1.Length = Convert.ToDouble(TB1.Text);
room1.Width = Convert.ToDouble(TB2.Text);
office.Rozetok = Convert.ToDouble(TB3.Text);
double norm = Convert.ToDouble(TB4.Text);
Label1.Content = office.Places(norm);
}
}
}
Ответы (2 шт):
Скорее всего, вы создавали экземпляр класса Office var office = new Office();. Таким образом, в Rozetor у вас не было ничего и возвращал он при обращении дефолтное значение для double (0). Нужно добавить конструктор класса (public Office(...)). Также, ваш код можно сократить, избавившись от лишнего поля и сократив метод.
public class Office : Room
{
public double Rozetor { get; private set; }
public Office(double rozetor)
{
Rozetor = rozetor;
}
public double Places(double s) =>
rozetok >= 2 && square() > s
? square() / rozetok
: 0;
}
Рассмотрим класс MainWindow. Вы создали 2 приватных поля и инициализировали их:
Room room1 = new Room();
Office office = new Office();
При нажатии на кнопку, вы присваиваете введённые значения длины и ширины свойствам Length и Width поля room1:
room1.Length = Convert.ToDouble(TB1.Text);
room1.Width = Convert.ToDouble(TB2.Text);
office.Length же и office.Width остались со значениями по умолчанию 0d!
После этого вы присваиваете введённое значение (количества розеток?) свойству Rozetok поля office:
office.Rozetok = Convert.ToDouble(TB3.Text);
Последнее действие - вызов метода office.Place(norm), которое у вас
всегда возвращает 0
Рассмотри класс Office. Как видно из вашего кода
public double Places(double s)
{
if (rozetok >= 2 && square() > s)
return square() / rozetok;
else
return 0;
}
метод Places(double s) возвращает 0d в двух случаях:
- если не выполнится условие
rozetok >= 2 && square() > s - если
square()вернёт0d(деление нуля на число)
Давайте вычислим office.square(). Вот его код:
public double square()
{
return length * width;
}
Так как office.Length и office.Width мы нигде не присваивали, office.square() = 0d * 0d = 0d. Следовательно, вызов office.Places(norm) вернёт 0d вне зависимости от аргумента.